오늘 저는 다음 기사를 통해 fifo에 대해 배웠습니다.명명된 파이프 소개, 거기에 언급되어 있습니다 cat <(ls -l)
.
몇 가지 실험을 했는데 sort < (ls -l)
오류가 발생했습니다.
-bash: syntax error near unexpected token `('`
그러다가 실수로 명령에 공백을 추가했다는 사실을 발견했습니다.
그런데 이 추가 명령으로 인해 이러한 오류가 발생하는 이유는 무엇입니까? 리디렉션 기호는 왜 서로 가까이 있어야 합니까 (
?
답변1
왜냐하면 그것은 a가 아니라 <
완전히 <()
다른 a이기 때문입니다. 이것은 ... 불리운다프로세스 교체, 이는 한 프로세스의 출력을 다른 프로세스의 입력으로 사용할 수 있는 일부 셸의 기능입니다.
연산자 >
는 <
출력과 입력을 리디렉션합니다.문서. 연산자는 <()
파일이 아닌 명령(프로세스)을 처리합니다. 당신이 달릴 때
sort < (ls)
ls
하위 쉘(대괄호의 의미)에서 명령을 실행한 다음 해당 하위 쉘을 입력 파일 로 sort
.
답변2
왜냐하면 상황이 그러하기 때문입니다.
<(...)
in은 bash
프로세스 대체 구문입니다. 동일한 연산자에서 복사되었습니다 ksh
.
<
, (
, )
, |
, &
, 는 다양한 조합으로 특수 연산자를 형성하는 데 사용되는 ;
특수 어휘 표시입니다 . ,,,... 각각의 역할이 있습니다. 리디렉션을 위해. , 파일에서 입력을 리디렉션합니다. 이름이 지정된 파일에서 입력을 리디렉션하지만 리디렉션 연산자가 아닌 다른 연산자입니다.bash
<
<(
<<
<&
<
<file
< file
<'(file)'
(file)
<(file)
< (file)
<
다음은 입니다 (file)
. 이 경우에는 bash
, (file)
효과가 없습니다. (...)
일부 상황에서는 단일 토큰으로 유효할 수 있습니다. 예를 들면 다음과 같습니다.
(sub shell)
func () {
...
}
var=(foo bar)
하지만 안에는 없어
sort < (cmd)
껍질 에서는 fish
상황이 다릅니다. In fish
, (...)
명령 대체에 사용됩니다( $(...)
in 과 동일 bash
). <
Bourne과 같은 쉘에서와 같이 입력 리디렉션 에 사용됩니다 .
그래서 fish
:
sort <(echo file)
다음과 동일합니다:
sort < (echo file)
그건:
sort < file
bash
하지만 이는 프로세스 교체 와는 완전히 다릅니다 .
yash
쉘 에서는 <(...)
다음 용도로 사용되지 않는 또 다른 POSIX 쉘입니다.프로세스 교체이 아니라면프로세스 리디렉션
저기,
sort <(ls -l)
부족:
sort 0<(ls -l)
리디렉션 연산자입니다. 다음과 다소 동일합니다.
ls -l | sort
in 은 bash
파이프 <(ls -l)
경로로 확장되므로 다음과 같습니다.
ls -l | sort /dev/fd/0
에서는 globbing 연산자( 및 파일 로 확장됨 ) 및 glob 한정자( 예: 디렉터리 파일로 확장됨) 로 오버로드 zsh
됩니다 .(...)
(*.txt|*.png)
txt
png
*(/)
에서 zsh
:
sort < (ls -l)
이는 (ls -l)
전역 한정자로 처리됩니다. glob l
한정자는 링크 수를 일치시키는 데 사용되며 그 뒤에 숫자가 있어야 합니다 l
(예: ls -ld ./*(l2)
2개의 링크가 있는 파일 나열). 이것이 바로 zsh: number expected
오류가 발생하는 이유입니다.
sort < (w)
쓰기 가능한 빈 이름의 파일이 일치하기 zsh: no matches found: (w)
때문에 오류가 발생합니다 .(w)
sort < (w|cat)
현재 디렉터리 및/또는 파일 w
의 내용을 정렬 합니다...cat