/bin/sh: 와일드카드 확장이 스크립트에서 작동하지 않습니다.

/bin/sh: 와일드카드 확장이 스크립트에서 작동하지 않습니다.

dash으로 사용하고 있습니다 /bin/sh. 내 스크립트에는 다음 줄이 있습니다.

SSH_AUTH_SOCK=/tmp/ssh-????????????/agent.*

이는 file 과 일치해야 합니다 /tmp/ssh-abcdefghijkl/agent.1234. 파일이 존재하더라도 스크립트는 패턴을 확장하지 않고 대신 변수에 리터럴 패턴을 포함합니다.

echo $SSH_AUTH_SOCK
/tmp/ssh-????????????/agent.*

하지만 명령줄에서 동일한 작업을 수행하면 패턴이 확장됩니다.

sh -c 'SSH_AUTH_SOCK=/tmp/ssh-????????????/agent.* ; echo $SSH_AUTH_SOCK'
/tmp/ssh-abcdefghijkl/agent.1234

내 스크립트에서 패턴 확장(와일드카드 일치)이 작동하지 않는 이유는 무엇입니까?

답변1

이와 같은 할당에서는 파일 이름 글로빙이 발생하지 않습니다.

SSH_AUTH_SOCK=/tmp/ssh-????????????/agent.*

귀하의 코드에서나타나다작업하려면 인용된 확장자가 없기 때문에 예상한 출력을 얻습니다 $SSH_AUTH_SOCK. 스크립트 sh -c가 수행하는 작업은 리터럴 문자열을 할당 /tmp/ssh-????????????/agent.*SSH_AUTH_SOCK다음 해당 변수를 따옴표 없이 사용하면 쉘이 와일드카드를 적용하는 것입니다 echo.

명령줄( echo $SSH_AUTH_SOCK인쇄 리터럴 모드)에서 시도할 때 다르게 동작하는 이유는 아마도 쉘을 사용하고 있거나(이러한 작업은 다르게 수행됨) 쉘에서 닫기 파일을 zsh사용하고 있기 때문일 것입니다. 이름은 다음과 같습니다. set -f와일드카드로 지정되었거나 일치하는 경로 이름이 전혀 없습니다.

당신이 제안한 것과 비슷한 것을하고 싶다면 다음을 사용하십시오.

set -- /tmp/ssh-????????????/agent.*
SSH_AUTH_SOCK=$1

위치 인수는 먼저 주어진 패턴(어휘순)과 일치하는 모든 경로 이름으로 설정됩니다. 그런 다음 할당합니다첫 번째변수에 대한 경로 이름입니다 SSH_AUTH_SOCK.

패턴과 일치하는 경로 이름이 없으면 패턴은 확장되지 않은 상태로 유지되며 나중에 변수에 있는 그대로 할당됩니다.

셸 에서는 bash위치 인수 대신 명명된 배열을 사용할 수 있습니다.

names=( /tmp/ssh-????????????/agent.* )
SSH_AUTH_SOCK=${names[0]}

관련 정보