Bash 스크립트의 Tar 아카이브 목록

Bash 스크립트의 Tar 아카이브 목록

아카이브를 쉽게 나열하기 위해 별칭에 바인딩된 함수가 있습니다.

function list-tar-archive {
  if [ "X$1" != 'X' ]; then
    out=tar -tf $1 | awk -F/ '{if (NF<3) print }'
    echo ${out}
  fi
}

alias list-tar='list-tar-archive'

별칭을 사용할 때 "명령 '-tf'를 찾을 수 없음"이 출력되는 이유가 약간 혼란스럽습니다.

~/workspace$ list-tar bits-and-bytes-proj.tgz
No command '-tf' found, did you mean:
 Command 'gtf' from package 'xserver-xorg-core' (main)
 Command 'tf' from package 'tf' (universe)
 Command 'tf' from package 'tf5' (universe)
 Command 'wtf' from package 'bsdgames' (universe)
-tf: command not found

하지만...

~/workspace$ tar -tf bits-and-bytes-proj.tgz | awk -F/ '{if (NF<3) 
print }'
bits-and-bytes-proj/
**truncated**

???

답변1

out=tar -tf $1 | awk -F/ '{if (NF<3) print }'

-tf $1out환경 변수를 로 설정하여 실행합니다 tar.

실제로 해야 할 일은 다음과 같습니다.

list-tar() {
    if [[ $1 ]];then
        tar -tf "$1" | awk -F/ 'NF<3'
    fi
}

프로그램이 단순화되었다는 점에 주목하세요 awk. 기본 동작은 이므로 해당 동작이 발생하려면 반드시 참이어야 하는 규칙으로 {print}사용했습니다 . NF<3(규칙은 /regex/패턴일 필요는 없습니다(기본값은 일치입니다 $0).) /두 문자 미만의 줄에 대한 간단한 grep도 트릭을 수행합니다.

또한 출력을 쉘 변수로 캡처한 다음 이를 다시 에코하는 것은 무언가를 수행하려는 경우가 아니면 어리석은 일입니다. 파일 이름의 공백으로 인해 버전도 중단됩니다. echo $out단어 분할 $out후 에코는 여러 매개변수를 공백으로 구분합니다. 따라서 여러 개의 공백이 하나의 공백이 되며 파일 이름에 있는 공백과 두 개의 개별 파일 사이의 차이를 알 수 없습니다.

[[ $1 ]][[ -n $1 ]]비어 있지 않은 쉘 변수에 대한 테스트를 작성하는 더 좋고 더 확실한 방법입니다 .이것이 설명한다[.[[


셸 함수는 명령으로 실행될 수 있으므로 다른 이유나 명명 체계가 없는 한 함수에 짧은 이름을 지정하고 별칭에 대해 걱정하지 마세요.

관련 정보