저는 데비안에서 Bash 5.1.4를 실행하고 있습니다.
구성 및 기타 파일을 홈 디렉터리의 위치에 복사하기 위한 설치 후 스크립트를 작성 중입니다. 각 파일의 시작 부분에 접두사를 사용하여 예상 대상을 추가했습니다. ( 물론 # DEST: $HOME/.config/mousepad/Thunar
스크립트에서 파일 이름은 변수로 대체되고 해시 기호는 적절한 주석 문자로 대체됩니다. 10줄 앞에 나타나면 반드시 첫 번째 줄에 나타날 필요는 없으므로 shebangs를 망칠 필요가 없습니다).
이러한 위치를 얻으려면 문자 그대로 를 반환하는 다음 명령을 사용 head Thunar.acs | egrep "DEST:" | awk '{print $3}
합니다 . 내가 그것을 시도할 때 오류가 발생한다는 뜻입니다 . 나는 읽었다$HOME/.config/Thunar
$HOME
ls $(head Thunar.acs | egrep "DEST:" | awk '{print $2})
ls: cannot access '$HOME/.config/Thunar/': No such file or directory
이 문제선택한 답변에서 모든 큰따옴표 조합을 시도했지만 여전히 오류가 발생합니다. 이 문제를 어떻게 해결할 수 있나요?
변수 이름을 중괄호로 묶는 것도 작동하지 않습니다.
감사해요!
답변1
명령 대체와 변수 확장은 재귀적이지 않습니다. 즉, 셸이 $varname
또는 와 같은 항목을 확장할 때 다른 인스턴스가 $(somecommand)
확장되도록 결과를 검색하지 않습니다 . 결과에 대해 수행하는 유일한 작업은 이를 "단어"로 분할하고 파일 이름 와일드카드처럼 보이는 항목을 확장하는 것입니다. 이는 다른 어떤 것보다 더 많은 문제를 야기하므로 거의 항상 확장을 큰따옴표로 묶어서 사용해야 합니다. 영향을 받지 않습니다.$varname
$(somecommand)
실제 홈 경로로 확장 하려는 경우 $HOME
내가 본 가장 쉬운 방법은 파이프하는 것입니다 envsubst
(이렇게 하면 환경 변수 참조처럼 보이는 모든 항목이 확장되지만 다음과 같은 경우에만 작동합니다.환경내보내지 않은 쉘 변수 대신 변수) 또는 awk
대체가 이루어졌습니다(대체하도록 지시한 특정 변수만 실행됨).
이 작업을 수행하는 방법을 보여주기 전에 전체 작업을 완벽하게 수행할 수 있는 세 가지 도구( head
, egrep
및 awk
- ) 를 사용하는 것에 반대해야 합니다 .awk
awk '/DEST:/ {print $3}; (NR>=10) {exit}' Thunar.acs
이 비트는 원래 /DEST:/
작업을 완료하고 대체합니다.egrep
(NR>=10) {exit}
head -n 10
작동 버전은 다음과 같습니다 envsubst
.
ls "$(awk '/DEST:/ {print $3}; (NR>=10) {exit}' Thunar.acs | envsubst)"
(단어 분리 및 와일드카드 확장이 이상한 작업을 수행하는 것을 방지하려면 큰따옴표를 참고하세요.)
awk
다음은 sub
대체를 위해 s 함수를 사용하는 버전입니다.
ls "$(awk -v home="$HOME" '/DEST:/ {sub("\\$HOME",home,$3); print $3}; (NR>=10) {exit}' Thunar.acs)"