서브쉘과 프로세스 교체의 차이점

서브쉘과 프로세스 교체의 차이점

Bash에서 현재 작업 디렉터리를 변수에 할당하고 싶습니다. 서브쉘을 사용하면 이 작업을 수행할 수 있습니다.

var=$(pwd)

echo $var
/home/user.name

다음과 같이 프로세스 대체를 사용하는 경우:

var=<(pwd)

echo $var
/dev/fd/63

내가 아는 한, 프로세스 대체는 프로그램이 STDIN을 허용하지 않을 때 주로 사용됩니다. 프로세스 교체가 정확히 무엇을 수행하는지, 왜 /dev/fd/63에 할당되는지는 확실하지 않습니다 var.

답변1

명령 대체( $(...))는 다음으로 대체됩니다.산출명령의 프로세스 대체( <(...))는 다음으로 대체됩니다.파일 이름명령의 출력을 읽을 수 있습니다. 두 경우 모두 명령은 하위 쉘에서 실행됩니다.

pwd귀하의 경우 in 출력은 <(pwd)에 있을 수 있습니다 /dev/fd/63. 명령이 실행되면 파일은 더 이상 존재하지 않습니다.사용var프로세스 교체 실행이 완료되었습니다(예제의 할당이 완료되면).

프로세스 대체에 의해 반환된 파일 이름은 일반 파일이 아닌 파일 설명자 또는 명명된 파이프의 이름입니다.

/dev/fd프로세스 대체는 명명된 파이프(FIFO) 또는 명명된 파일 열기 방법을 지원하는 시스템에서 지원됩니다.

프로세스 대체의 일반적인 용도는 join명령에 대한 파일을 사전 주문하는 것입니다.

$ join <( sort file1 ) <( sort file2 )

cut또는 파일에서 열을 제거합니다(여기서는 paste두 번 사용하고 결과를 연결하여 탭으로 구분된 파일에서 열 2가 제거됩니다).

$ paste <( cut -f 1 file ) <( cut -f 3- file )

프로세스 대체는 임시 파일의 명시적인 사용을 피하기 위한 구문상의 지름길입니다.


명령 대체와 프로세스 대체는 모두 서브쉘에서 수행됩니다. 아래와 같이 이러한 하위 쉘의 환경은 상위 쉘의 환경에 영향을 주지 않습니다.

$ unset t
$ echo "$( t=1234; echo "$t" )"
1234
$ echo "$t"
(empty line output)

여기서는 명령 대체에서 문자열 매개변수를 echo가져옵니다 .1234

$ unset t
$ cat <( t=4321; echo "$t" )
4321
$ echo "$t"
(empty line output)

여기에서 cat파일의 파일 이름(파이프/파일 설명자라는 이름)을 인수로 가져옵니다. 이 파일에는 데이터가 포함되어 있습니다 4321.

관련 정보