사람들의 시스템에서 부분적으로 변경된 디렉토리를 찾으려고 시도하는 bash 스크립트가 있습니다.
cd "$HOMEDIR/AppData/Local/GitHub/PortableGit"*"/bin"
그러나 이것은 작동하지 않는 것 같습니다. 문자열 리터럴만 허용합니다.
올바르게 크기를 조정하는 쉬운 방법이 있습니까?
편집하다:
글쎄요, 이상하네요. 가끔은 효과가 있을 때도 있어요.
내가 이것을 할 때 :
GIT_DIR=$HOMEDIR/AppData/Local/GitHub/PortableGit*/bin
eval GIT_DIR_PASS=$GIT_DIR
echo $GIT_DIR_PASS
정확한 정보를 얻었네요
하지만 $GIT_DIR_PASS를 다른 변수에 할당하려고 하면 문자열 리터럴 버전이 표시됩니다.
답변1
GIT_DIR=$HOMEDIR/AppData/Local/GitHub/PortableGit*/bin
위의 와일드카드는 다음을 포함할 수 있는 스칼라 변수에 할당하기 때문에 확장되지 않습니다.하나문자열이므로 토큰화나 파일 이름 생성이 발생하지 않습니다.
eval GIT_DIR_PASS=$GIT_DIR
여기서는 간단한 명령에 대한 인수이므로 와일드카드가 확장되지만 경로가 "GIT_DIR_PATH=..."
.
echo $GIT_DIR_PASS
여기서는 와일드카드가 확장됩니다. 변수의 내용을 인쇄하는 대신 변수가 참조되지 않기 때문에 확장에 의해 생성된 인수 목록을 인쇄합니다.
당신이 원하는 것:
set -- "$HOMEDIR"/AppData/Local/GitHub/PortableGit*/bin
즉, 패턴을 일치하는 파일 목록으로 확장하고 이를 $1
, $2
... 에 할당합니다.
GIT_DIR=$1
첫 번째 것을 선택하십시오.
답변2
보세요이 예방법을 알아보세요 bash
. 또한 그런 eval
것들은 잊어버리세요.
/bin/
직접 하위 디렉터리의 직접 하위 디렉터리인 이름이 지정된 모든 디렉터리와 일치하는 glob .../PortableGit/
:
HOMEDIR=/home/$USER
ls "$HOMEDIR/AppData/Local/GitHub/PortableGit/"*"/bin"
나는 cd
그것이 당신의 문제라고 생각합니다. 정확히 무엇을 하길 원하시나요? 표현식과 일치하는 디렉토리가 여러 개 있는 경우, cd
여기서 수행할 계획이 무엇이든 일치하는 첫 번째 디렉토리에서 끝나기 때문에 이 방식으로 호출하는 것은 소용이 없습니다. 순차적으로 디렉터리를 입력하고 그 안에서 작업을 수행하려면 일치하는 출력에 대해 루프를 수행하는 것이 find
더 적절해 보입니다.
비슷한 질문이 있습니다스택 오버플로.