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)。)/2文字未満の行に対して単純なgrepもトリックを実行します。

また、出力をシェル変数としてキャプチャしてからそれを再エコーすることは、何かをしたいと思わない限り愚かです。ファイル名の空白のため、バージョンも中断されます。 echo $out単語分割$out後、エコーは複数のパラメータをスペースで区切ります。したがって、複数のスペースが1つのスペースになり、ファイル名のスペースと2つの別々のファイルの違いを知ることはできません。

[[ $1 ]][[ -n $1 ]]空でないシェル変数のテストを書くためのより良い、より確実な方法です。これが説明する[[[.


シェル関数はコマンドで実行できるため、他の理由や命名スキームがない限り、関数に短い名前を付けてエイリアスを心配しないでください。

関連情報