명령의 경우 -
파일 이름 대신 인수로 사용되면 STDIN 또는 STDOUT을 나타냅니다.
하지만 이 예에서는 다음이라는 파일을 생성합니다
-
.echo hello > -
-
이 예에서 STDOUT을 어떻게 나타낼 수 있습니까 ?대신 다음과 같이
-
예제에 명명된 파일을 이해하기 쉽게 만들려면 어떻게 해야 합니까 ?-
cat -
답변1
stdin/stdout을 나타내기 위해 파일 이름을 사용하는 것은 -
많은 프로그램에서 사용되는 규칙입니다. 이는 파일 이름의 특별한 속성이 아닙니다. 이는 커널에서 특별한 것으로 간주되지 않으므로 파일 이름을 참조하는 모든 시스템 호출은 -
파일 이름을 문자 그대로 사용합니다.-
-
Bash 리디렉션을 사용하면 -
이는 특수 파일 이름으로 인식되지 않으므로 Bash는 이를 리터럴 파일 이름으로 사용합니다.
cat
문자열이 파일 이름으로 처리 되면 -
stdin의 동의어로 처리됩니다. 이 문제를 해결하려면 cat
표시되는 문자열이 여전히 파일 이름을 참조하도록 변경해야 합니다 -
. 이를 수행하는 일반적인 방법은 파일 이름 앞에 경로를 추가하는 것입니다 ./-
. /home/Tim/-
이 기술은 명령줄에서 유사한 문제를 해결하는 데에도 사용됩니다. 옵션이 파일 이름과 충돌합니다. 예를 들어 이라는 파일은 프로그램의 명령줄 옵션 ./-e
으로 표시되지 않습니다 .-e
>& filename
1 bash가 결국 csh에서 복사하여 stdout 및 stderr을 리디렉션하는 연산자를 제외하고 , >&-
파일 설명자는 Bourne 쉘에서와 같이 여전히 닫혀 있으며, -
인용되거나 확장되더라도 결과는 >&
이 연산자를 임의의 파일 이름에 사용할 수 없음을 의미합니다. 표준/Bourne > "$file" 2>&1
구문 또는 bash 관련 구문을 사용하세요 &> "$file"
.
답변2
대신
echo hello > -
을 사용할 수 있습니다echo hello > /dev/stdout
."-"는 이를 지원하려는 모든 프로그램이 구현해야 하는 규칙이지만,
/dev/stdin
운영 체제가 이를 지원하는 경우(적어도 Solaris, Linux 및 BSD), , 및 는 응용 프로그램 독립적이며/dev/stdout
작업/dev/stderr
계획대로 진행됩니다.
답변3
~처럼캠이 언급됨는 -
일부 프로그램에서 사용되는 명명 규칙일 뿐입니다. 쉘이 인식하는 파일 설명자를 사용하여 이러한 스트림을 참조하려면,질리언 그레이가 옳다/dev/stdin
그 이름을 사용 하거나 대신 사용하십시오 /dev/stdout
. 이러한 파일 이름은 일반 파일 이름을 사용할 수 있는 모든 곳에서 작동해야 합니다.
즉, 첫 번째 예는 약간 어리석습니다. 리디렉션 연산자가 캡처하여 파일에 쓴 모든 출력은 이미 표준 출력이므로 리디렉션하고 원래 위치에 다시 쓰는 데는 소용이 없습니다. 여기서 사용하는 동작은 리디렉션이 아니라 파이핑입니다.
echo hello |
두 번째 예에서는 내부 별칭이 아닌 해당 이름의 정크 파일을 원한다는 표시를 제공합니다. 다음과 같이 파일 경로를 지정하면 가장 간단하게 이 작업을 수행할 수 있습니다.
cat ./-
답변4
"-" 방법에는 많은 문제가 있습니다. 첫째, 많은 프로그램에서 수행하지 않는 "-" 문자의 해석이 필요합니다. 또한 일부 프로그램에서는 하이픈을 명령줄 옵션의 끝을 표시하는 구분 기호로 해석합니다. 이 프로그램은 파일 이름 인수와 함께 작동하도록 작성되었으며 "-" 방법은 해킹이지만 훌륭하지만 약합니다.
가장 좋은 방법은 다음과 같습니다.
$ echo hello > /dev/fd/1
/dev/stdout
심볼릭 링크입니다/dev/fd/1