데이터를 bash로 파이프하면 "$0"은 어떻게 되나요?

데이터를 bash로 파이프하면 "$0"은 어떻게 되나요?

다음과 같은 bash 파일이 있다고 가정해 보겠습니다.

cd $(dirname "$0");

파일을 직접 실행하는 대신 파일을 읽은 다음 bash를 통해 파이프하면 어떻게 되나요? "$0"을 어떻게 설명하나요?

echo "$(cat <file>)" | bash

내가 묻는 이유는 파일이 더 이상 예전 위치에서 실행될 필요가 없기 때문에 $0이 무엇을 의미하는지 불분명해 보이기 때문입니다. 어쩌면 bash는 그것이 어디에 있는지 기억하고 $0은 여전히 ​​원래 파일 위치를 참조하고 있을까요? 그럴 것 같지 않습니다.

답변1

$0그런 다음 bash가 호출되는 이름은 다음과 같습니다.

$ printf '%s\n' 'echo $0' | bash
bash
$ printf '%s\n' 'echo $0' | ARGV0=sh bash
sh
$ printf '%s\n' 'echo $0' | ARGV0='blah blah' bash
blah blah

두 번째 및 세 번째 명령은 zsh에서 실행되며 특수 변수를 사용하여 0번째 인수를 설정할 수 있습니다 ARGV0. 하지만 심볼릭 링크를 사용하여 시뮬레이션할 수 있습니다.

$ ln -s "$(command -v bash)" foo
$ printf '%s\n' 'echo $0' | ./foo
./foo

~에서배쉬 매뉴얼:

($0)은 쉘 또는 쉘 스크립트의 이름으로 확장됩니다. 이는 쉘이 초기화될 때 설정됩니다. 명령 파일을 사용하여 Bash를 호출하는 경우(참조 쉘 스크립트), $0파일 이름으로 설정합니다. Bash가 이 옵션으로 시작되면 -c(참조배쉬에게 전화하기) $0실행될 문자열 뒤의 첫 번째 인수(있는 경우)로 설정됩니다. 그렇지 않으면 인수 0으로 지정된 대로 Bash를 호출하는 데 사용되는 파일 이름으로 설정됩니다.

관련 정보