셸 또는 하위 셸에서 코드 실행 사이의 예상치 못한 차이점

셸 또는 하위 셸에서 코드 실행 사이의 예상치 못한 차이점

쉘 또는 서브쉘에서 코드를 실행하는 것 사이에 이러한 차이가 예상됩니까?

$ a() { echo ${@: -1} ; }
$ echo "echo ${*: -1}" > b
$ chmod +x b
$ a 1 2 3
3
$ ./b 1 2 3
bash
$ 

데비안 시드
배쉬 버전 5.2.15

답변1

여기:

$ echo "echo ${*: -1}" > b

"${*: -1}"큰따옴표로 묶여 있으므로 즉시 확장됩니다 . or와 함께 슬라이스 표기법을 사용하면 , , ...부터 시작하는 위치 인수 목록뿐만 아니라 , , ...의 목록도 $*살펴봅니다 . $@음수 인덱스는 끝에서부터 거꾸로 계산되므로 at에서 시작하면 목록의 마지막 요소가 제공됩니다.$0$1$1-1

대화형 셸에는 위치 인수가 없을 수 있으므로 이 목록의 마지막 요소는 $0셸 이름을 지정하는 데 사용됩니다. 귀하의 경우에는 해당되는 것으로 보이며 bash파일 b에는 echo bash.

함수 내에서 ${@: -1}함수 자체의 위치 매개변수를 확인하세요. 그 중 마지막 매개변수는 입니다 3.

echo ${*: -1}문자열을 파일에 저장하려면 작은따옴표를 사용하여 확장을 방지하세요. 확장이 발생할 때 인용할 수 있도록 큰따옴표를 추가하는 것도 좋은 생각입니다.

echo 'echo "${*: -1}"' > c

그러나 여기에는 서브셸이 없으며 함수와 외부 스크립트만 있습니다.

관련 정보