파일 이름 대신 대시(-)를 사용하세요.

파일 이름 대신 대시(-)를 사용하세요.

명령의 경우 -파일 이름 대신 인수로 사용되면 STDIN 또는 STDOUT을 나타냅니다.

  1. 하지만 이 예에서는 다음이라는 파일을 생성합니다 -.

    echo hello > -
    

    -이 예에서 STDOUT을 어떻게 나타낼 수 있습니까 ?

  2. 대신 다음과 같이 -예제에 명명된 파일을 이해하기 쉽게 만들려면 어떻게 해야 합니까 ?-

    cat -
    

답변1

stdin/stdout을 나타내기 위해 파일 이름을 사용하는 것은 -많은 프로그램에서 사용되는 규칙입니다. 이는 파일 이름의 특별한 속성이 아닙니다. 이는 커널에서 특별한 것으로 간주되지 않으므로 파일 이름을 참조하는 모든 시스템 호출은 -파일 이름을 문자 그대로 사용합니다.--

Bash 리디렉션을 사용하면 -이는 특수 파일 이름으로 인식되지 않으므로 Bash는 이를 리터럴 파일 이름으로 사용합니다.

cat문자열이 파일 이름으로 처리 되면 -stdin의 동의어로 처리됩니다. 이 문제를 해결하려면 cat표시되는 문자열이 여전히 파일 이름을 참조하도록 변경해야 합니다 -. 이를 수행하는 일반적인 방법은 파일 이름 앞에 경로를 추가하는 것입니다 ./-. /home/Tim/-이 기술은 명령줄에서 유사한 문제를 해결하는 데에도 사용됩니다. 옵션이 파일 이름과 충돌합니다. 예를 들어 이라는 파일은 프로그램의 명령줄 옵션 ./-e으로 표시되지 않습니다 .-e


>& filename1 bash가 결국 csh에서 복사하여 stdout 및 stderr을 리디렉션하는 연산자를 제외하고 , >&-파일 설명자는 Bourne 쉘에서와 같이 여전히 닫혀 있으며, -인용되거나 확장되더라도 결과는 >&이 연산자를 임의의 파일 이름에 사용할 수 없음을 의미합니다. 표준/Bourne > "$file" 2>&1구문 또는 bash 관련 구문을 사용하세요 &> "$file".

답변2

  1. 대신 echo hello > -을 사용할 수 있습니다 echo hello > /dev/stdout.

    "-"는 이를 지원하려는 모든 프로그램이 구현해야 하는 규칙이지만, /dev/stdin운영 체제가 이를 지원하는 경우(적어도 Solaris, Linux 및 BSD), , 및 는 응용 프로그램 독립적이며 /dev/stdout작업 /dev/stderr계획대로 진행됩니다.

답변3

~처럼캠이 언급됨-일부 프로그램에서 사용되는 명명 규칙일 뿐입니다. 쉘이 인식하는 파일 설명자를 사용하여 이러한 스트림을 참조하려면,질리언 그레이가 옳다/dev/stdin그 이름을 사용 하거나 대신 사용하십시오 /dev/stdout. 이러한 파일 이름은 일반 파일 이름을 사용할 수 있는 모든 곳에서 작동해야 합니다.

  1. 즉, 첫 번째 예는 약간 어리석습니다. 리디렉션 연산자가 캡처하여 파일에 쓴 모든 출력은 이미 표준 출력이므로 리디렉션하고 원래 위치에 다시 쓰는 데는 소용이 없습니다. 여기서 사용하는 동작은 리디렉션이 아니라 파이핑입니다.

    echo hello |
    
  2. 두 번째 예에서는 내부 별칭이 아닌 해당 이름의 정크 파일을 원한다는 표시를 제공합니다. 다음과 같이 파일 경로를 지정하면 가장 간단하게 이 작업을 수행할 수 있습니다.

    cat ./-
    

답변4

"-" 방법에는 많은 문제가 있습니다. 첫째, 많은 프로그램에서 수행하지 않는 "-" 문자의 해석이 필요합니다. 또한 일부 프로그램에서는 하이픈을 명령줄 옵션의 끝을 표시하는 구분 기호로 해석합니다. 이 프로그램은 파일 이름 인수와 함께 작동하도록 작성되었으며 "-" 방법은 해킹이지만 훌륭하지만 약합니다.

가장 좋은 방법은 다음과 같습니다.

$ echo hello > /dev/fd/1

/dev/stdout심볼릭 링크입니다/dev/fd/1

관련 정보