정렬 <(ls -l)`은 작동하지만 정렬 <(ls -l)`은 왜 실패합니까? -l). 을 사용하여 몇 가지 실험을

오늘은이 기사 FIFO에 대해 뭔가를 배우고 : 소개 명명 된 파이프에 언급, cat <(ls -l).

을 사용하여 몇 가지 실험을 sort < (ls -l)했는데 오류가 발생합니다.

-bash: syntax error near unexpected token `('`

그런 다음 명령에 여분의 공간을 잘못 추가했습니다.

그러나 왜이 추가 명령이 실패로 이어질까요? 리디렉션 기호가 (?



답변

<그것이 아니기 때문에 <()완전히 다른 것입니다. 이것을 프로세스 대체 라고 하며 특정 쉘의 기능으로 한 프로세스의 출력을 다른 프로세스의 입력으로 사용할 수 있습니다.

><연산자에서 출력 및 입력 리디렉션 파일을 . <()운영자는, 파일이 아닌 명령 (프로세스)를 다룬다. 달릴 때

sort < (ls)

ls서브 쉘 에서 명령을 실행 (괄호가 의미하는 것) 한 다음 해당 서브 쉘을 입력 파일로에 전달하려고합니다 sort. 그러나이 구문은 허용되지 않으며 사용자가 본 오류가 발생합니다.


답변

그것이 의도 된 방식이기 때문입니다.

<(...)in bash은 프로세스 대체 구문입니다. 의 동일한 연산자에서 복사되었습니다 ksh.

<, (, ), |, &, ;특수 어휘 토큰입니다 bash서로 다른 조합으로 특별한 연산자를 형성하는 데 사용됩니다. <, <(, <<, <&… 각각 자신의 역할을한다. <리디렉션을위한 것입니다. <file, < file파일에서 입력을 리디렉션합니다. <'(file)'이라는 파일에서 입력을 리디렉션 (file)하지만 <(file)리디렉션 연산자가 아닌 다른 연산자입니다.

< (file)<다음에 (file). 그런 맥락에서,에서 bash, (file)유효하지 않습니다. (...)다음과 같은 일부 상황에서 단일 토큰으로 유효 할 수 있습니다.

(sub shell)
func () {
  ...
}
var=(foo bar)

그러나

sort < (cmd)

에서 fish쉘, 그것은 다릅니다. 이어 fish, (...)명령 대체 (동등위한 $(...)에서 bash). 그리고 <본쉘처럼 입력 리디렉션을위한 것입니다.

그래서 fish:

sort <(echo file)

다음과 같습니다.

sort < (echo file)

그건:

sort < file

그러나 그것은 bash프로세스 대체와 완전히 다른 것 입니다.

에서 yash쉘 다른 POSIX 쉘 <(...)위해없는 프로세스 교체 되지만위한 프로세스 재

거기에,

sort <(ls -l)

짧게 :

sort 0<(ls -l)

리디렉션 연산자입니다. 다음과 다소 비슷합니다.

ls -l | sort

에있는 동안 bash은이 <(ls -l)때문에 더 많은처럼, 파이프의 경로로 확장됩니다

ls -l | sort /dev/fd/0

에서 zsh, (...)글 로빙 연산자 오버로드 ( (*.txt|*.png)로 확장 할 txtpng과 (글로브 규정 자로 파일) *(/)디렉토리 파일에 인스턴스가 확장 용).

에서 zsh의 :

sort < (ls -l)

그것은 (ls -l)glob 한정자로 취급 될 것입니다. l링크의 수에 일치하는 것입니다 후 번호를 기대 예선 글로브 l(같이하는 것은 ls -ld ./*(l2),이 개 링크가있는 파일을 나열 것이다) 그래서 당신이 얻는 이유의 zsh: number expected오류가.

sort < (w)쓰기 가능한 빈 이름을 가진 파일과 일치하는 zsh: no matches found: (w)대신 오류가 발생 했을 것 (w)입니다.

sort < (w|cat)현재 디렉토리에서 파일 w및 / 또는 cat파일 의 내용을 정렬했을 것입니다 …