アーカイブを簡単にリストするために、エイリアスにバインドされた関数があります。
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 $1
out
環境変数をに設定して実行します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 ]]
空でないシェル変数のテストを書くためのより良い、より確実な方法です。これが説明する[
[[
.
シェル関数はコマンドで実行できるため、他の理由や命名スキームがない限り、関数に短い名前を付けてエイリアスを心配しないでください。