bash関数に渡す前にbashエイリアスをどのように評価しますか?

bash関数に渡す前にbashエイリアスをどのように評価しますか?

テストエイリアスを次のように定義しました。

alias testalias='python3 -c "f = open(\"/tmp/testopenfile\", \"w+\"); f.write(\"hi\n\")"'

端末経由で直接実行すると正常に動作します。 /tmp/testopenfileをうまく処理できます。また、エラーとプログラム出力を背景にして沈黙させるヘルパー関数も定義しました。私はこの関数を長時間かかったり、whileループ内のいくつかのエイリアスと一緒に使用したいと思います(単純な例ではありません)。これは次のように定義されます。

detach is a function
detach ()
{
    $1 > /dev/null 2> /dev/null &
}

私はbashを使用しており、これら2つを組み合わせようとしています。試してみるとdetach testaliasうまくいかないようです(/tmp/testopenfileが生成されないようです)。 testaliasが評価されずに直接渡されるようです。合格する前にこの評価を実行するためのヒントは何ですか?

また、このコードはファイルを生成します。

python3 -c "f = open(\"/tmp/testopenfile\", \"w+\"); f.write(\"hi\n\")" 1>/dev/null 2>/dev/null &

ベストアンサー1

エイリアスを関数に置き換えます。

testalias() {
    python3 -c 'f = open("/tmp/testopenfile", "w+"); f.write("hi\n")'
}
detach ()
{
    "$@" > /dev/null 2> /dev/null &
}

Bashはエイリアスを拡張するためにコマンドの最初の単語だけを調べるので、この関数はリテラル引数を使用しますtestalias。 (zshにはコマンドラインのどこからでも拡張できる「グローバル」エイリアスがあると思いますが、エイリアスのecho testalias内容を拡張したいかどうかは疑問です。)

エイリアス拡張も拡張前の解析プロセスの初期に発生するため、関数の$1実行時に$1拡張は同じtestaliasで変更されていません。コマンドが見つからないというエラーが発生する可能性がありますtestalias。ただし、stderrがリダイレクトされ、エラー/dev/nullは表示されません。

実際に関数が呼び出されると、関数内のエイリアスが拡張されます。F、使用するときより。

$ alias foo="echo abc"
$ f() { foo; }
$ alias foo="echo def"
$ g() { foo; }
$ f
abc
$ g
def

testalias機能の場合、testalias命令を検索すると見つかります。

おすすめ記事