일반적으로 $0
스크립트 이름이나 호출되는 모든 항목(경로 포함)으로 스크립트에 설정됩니다. 그러나 옵션 bash
과 함께 사용하면 명령 문자열 다음에 전달된 첫 번째 인수로 설정됩니다.-c
$0
bash -c 'echo $0' foo bar
# foo
실제로 위치 매개변수가 변경된 것 같지만 $0
명령 shift
문자열에는 아무런 영향이 없습니다 $0
(정상).
bash -c 'echo $0; shift; echo $0' foo bar
# foo
# foo
명령 문자열이 이처럼 이상한 동작을 보이는 이유는 무엇입니까? 저는 이 이상한 동작을 수행하는 이유와 근거를 찾고 있습니다.
그러한 명령 문자열에는 $0
일반적으로 정의된 매개변수가 필요하지 않다고 추측할 수 있으므로 경제적인 측면에서 일반 매개변수에도 사용됩니다. 그런데 이 경우에는 shift
이상하게 행동합니다. 또 다른 가능성은 $0
프로그램의 동작을 정의하는 것입니다(la 또는 로 호출됨 bash
) . 그러나 여기서는 명령 문자열에서만 볼 수 있고 프로그램이 보는 명령 문자열에서는 호출할 수 없기 때문에 불가능합니다 . 다른 용도는 생각나지 않아서 설명할 수가 없네요.sh
vim
vi
$0
$0
답변1
$0
이를 통해 인라인 스크립트를 사용할 시기를 설정/선택할 수 있습니다 . 그렇지 않으면 $0
그냥 bash
.
그러면 다음과 같이 할 수 있습니다:
$ echo foo > foo
$ bash -c 'wc -c < "${1?}"' getlength foo
4
$ rm -f bar
$ bash -c 'wc -c < "${1?}"' getlength bar
getlength: bar: No such file or directory
$ bash -c 'wc -c < "${1?}"' getlength
getlength: 1: parameter not set
모든 쉘이 이 작업을 수행하는 것은 아닙니다. Bourne Shell이 해냈습니다. Korn(및 Almquist) 쉘은 첫 번째 인수를 사용하도록 선택합니다 $1
. POSIX는 결국 Bourne 접근 방식을 채택했기 때문에 ksh
파생 상품은 ash
나중에 이 접근 방식으로 되돌아갔습니다(자세한 내용은 다음을 참조하세요).http://www.in-ulm.de/~mascheck/various/find/#shell). 이는 오랫동안 sh
(Bourne, Almquist 또는 Korn 쉘 기반 시스템에 따라) 첫 번째 인수가 들어가는지 여부를 알 수 없으므로 $0
이식성 $1
을 위해 다음을 수행해야 함을 의미합니다.
sh -c 'echo foo in "$1"' foo foo
또는:
sh -c 'shift "$2"; echo txt files are "$@"' tentative-arg0 3 2 *.txt
고맙게도 POSIX는 첫 번째 인수 항목에 대한 새로운 동작을 지정했으므로 $0
이제 다음을 이식 가능하게 수행할 수 있습니다.
sh -c 'echo txt files are "$@"' meaningful-arg0-for-error *.txt
답변2
이 행동은POSIX에 의해 정의됨:
sh -c 명령 이름 [매개변수...]
command_string 피연산자에서 명령을 읽습니다. 특수 매개변수 0의 값을 설정합니다(참조:특수 매개변수) 나머지 매개변수 피연산자부터 순서대로 command_name 피연산자 및 위치 매개변수($1, $2 등)의 값부터 시작합니다.
이 동작을 원하는 이유는 다음과 같습니다. 이렇게 하면 스크립트와 문자열 사이의 간격이 제거됩니다 -c
. 동작을 변경하지 않고 둘 사이를 직접 변환할 수 있습니다. 다른 영역에서는 이러한 사항이 동일하다는 점에 의존합니다.
이는 프로그램 매개변수가 작동하는 일반적인 방식에도 적합합니다. 이는 궁극적으로 다음 중 하나를 호출하는 것으로 귀결됩니다.exec
여기서 첫 번째로 제공된 인수도 마찬가지 $0
이며, 해당 인수가 실행 중인 실행 파일과 동일한 경우가 많습니다. 그러나 때로는 거기에 특별한 값이 필요하고 그것을 얻을 수 있는 다른 방법이 없는 경우도 있습니다. 매개변수가 존재한다는 점을 고려하면, 매개변수는 무엇인가에 매핑되어야 하며 사용자는 그것이 무엇인지 설정할 수 있어야 합니다.
이러한 일관성(그리고 가능한 역사적 사고)이 당신이 발견한 상황으로 이어집니다.