私はGNU bashバージョン4.3.48(1)-リリース(x86_64-pc-linux-gnu)でLinux Mint 18.2を使用しています。
100GB以上のファイルによく使用されるため、進行状況を表示するために定義した関数でsha256sum
上書きしたいと思います。.bash_aliases
機能は次のとおりです。
function sha256sum {
if [ -z "$1" ]
then
{
\sha256sum --help
}
else
{
pv $1 | \sha256sum -b
}
fi
}
しかし、説明できない犯人が何人かいます。
まず、予期せず動作してパラメータを「食べる」ことを強制しました。
具体的には、次のファイルは次のようになります。
-rw-r--r-- 1 root root 2.0K Jul 24 12:29 testdisk.log
これで終了しないファイルサイズを出力します。
vlastimil@vb-nb-mint ~ $ sha256sum testdisk.log
1.92KiB 0:00:00 [40.8MiB/s] [====================================================>] 100%
1.92KiB
1.92KiB
1.92KiB
1.92KiB
1.92KiB
1.92KiB
1.92KiB
1.92KiB
1.92KiB
1.92KiB
1.92KiB
...
...
...
^C
[1]+ Stopped pv $1 | \sha256sum -b
私は何が間違っていましたか?中かっこの有無、セミコロンの有無などさまざまな構造を試しましたが、1時間以上これ以上の結果が得られませんでした。
編集1:
\
次のように関数記号を削除します。
function sha256sum {
if [ -z "$1" ]
then
{
sha256sum --help
}
else
{
pv "$1" | sha256sum -b
}
fi
}
結果:
1.92KiB 0:00:00 [56.8MiB/s] [====================================================>] 100%
1.92KiB
1.92KiB
1.92KiB
1.92KiB
...
...
...
^C
[2]+ Stopped pv "$1" | sha256sum -b
答え1
\sha256sum
関数本体の各項目は、関数への再帰呼び出しです。名前の前にバックスラッシュを付けるとエイリアスとして解釈されませんが、関数として解釈されることは防げません。
たとえば、元の関数のレイアウトを維持しながら、次のようにcommand sha256sum
作成したいと思います。\sha256sum
function sha256sum {
if [ -z "$1" ]
then
{
command sha256sum --help
}
else
{
pv "$1" | command sha256sum -b
}
fi
}
答え2
〜のようにダグが指摘した、関数を再帰的に呼び出しています。
彼はバックスラッシュを削除し、command
代わりにバックスラッシュを使用するように正しくアドバイスしました。
また、中括弧は必須ではありませんが、許可されます。
私の機能は次のとおりです。
sha256sum () {
if [ -n "$1" ]; then
pv "$1" | command sha256sum -
else
command sha256sum --help
fi
}
このシェル機能の欠点は、コマンドラインフラグを複数のsha256sum
入力ファイルに渡すことができないことです。