アンダースコア変数を実際に使用できますか?

アンダースコア変数を実際に使用できますか?

コマンドを実行すると、最後のパラメータが保存され、_アクセスできます。

$ echo $_

それほど有用な機能ではないようです。では、なぜ面倒なのか?実用的なアプリケーションはありますか?

答え1

インタラクティブな用途に使用され、「コードゴルフ」に使用できます。

次の一時変数は不要で、コードを減らすことができます。

temp=$destdir/$outfile
cp $infile $temp
chmod go-w $temp

到着

cp $infile $destdir/$outfile
chmod go-w $_

$_この機能は表示されません。特殊パラメータPOSIX; Bash拡張です(おそらく別のシェルにあります)。

debugこれは、次のスクリプトに示すようにトラップを設定すると、中断される正しく実装されていないハッキングです。

#!/bin/bash

dbg()
{
  :
}

echo abc
echo $_

trap dbg debug

echo abc
echo $_

Bash 4.4.20の出力は次のとおりです。

$ ./underscore.sh
abc
abc
abc
dbg

$_デバッグトラップを有効にすると、期待値がレンダリングされなくなったことがわかります。本明細書において、「最後の命令」とは、文字通り命令シーケンスの前の命令ではなく、最後に実行された命令を意味する。abcecho abc$_

デバッグトラップの助けを借りて実装されたデバッガを使用してデバッグしたいすべてのBashプログラムはそれを使用したくありません。

の対話型使用は$_同じです。前のコマンドの最後の引数を参照してください。これは質問です:なぜコマンドの1つではなくこれを使用するのか、M同じプロジェクトをコマンドラインに拡張するのですか_M.

違いは次のとおりです$_

  • 長いパスを拡張するよりもはるかにコンパクトです。

  • コマンドが履歴から呼び出されると、履歴の以前のコマンドを参照せずに、最後$_に実行されたコマンドを参照します。これは悪用される可能性があります。同じ引数を使用して前のコマンドを完全に繰り返すのではなく、最後に使用された$_右側の引数に対する操作を含むコマンドを呼び出して再利用できます。

  • 生成されたコンテンツは、生成された前のコマンドの実際の最後の引数をM.使用して拡張されていない元のコマンドラインに基づいています。$_この違いを次のように表示できます。

    $ echo a{b,c}
    ab ac
    $ echo $_
    ac
    $ echo a{b,c}
    $ echo █
    

    カーソルブロックが指す点にコマンドを入力します。M.メタはまたは修飾子である可能性Mがあります。結果:EscAlt

    $ echo a{b,c}█
    

    つまり、a{b,c}意味項目ではなく、前のコマンドで空でない元の最後のトークンを挿入しますac。これは、GNU Bash機能ではなく、GNU Readline機能に近いものです。

答え2

よく混ぜて使う

mkdir verylongdirectoryname
cd $_

関連情報