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]}