$ 내 환경 변수 확장(명령 대체)

$ 내 환경 변수 확장(명령 대체)

저는 데비안에서 Bash 5.1.4를 실행하고 있습니다.

구성 및 기타 파일을 홈 디렉터리의 위치에 복사하기 위한 설치 후 스크립트를 작성 중입니다. 각 파일의 시작 부분에 접두사를 사용하여 예상 대상을 추가했습니다. ( 물론 # DEST: $HOME/.config/mousepad/Thunar스크립트에서 파일 이름은 변수로 대체되고 해시 기호는 적절한 주석 문자로 대체됩니다. 10줄 앞에 나타나면 반드시 첫 번째 줄에 나타날 필요는 없으므로 shebangs를 망칠 필요가 없습니다).

이러한 위치를 얻으려면 문자 그대로 를 반환하는 다음 명령을 사용 head Thunar.acs | egrep "DEST:" | awk '{print $3}합니다 . 내가 그것을 시도할 때 오류가 발생한다는 뜻입니다 . 나는 읽었다$HOME/.config/Thunar$HOMEls $(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, egrepawk- ) 를 사용하는 것에 반대해야 합니다 .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)"

관련 정보