`sort <(ls -l)`은 작동하지만 `sort < (ls -l)`은 실패하는 이유는 무엇입니까?

`sort <(ls -l)`은 작동하지만 `sort < (ls -l)`은 실패하는 이유는 무엇입니까?

오늘 저는 다음 기사를 통해 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)txtpng*(/)

에서 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

관련 정보