Ubuntuターミナルで次のようなチェーンアクションを実行できるかどうか疑問に思います。
action 1 on objectA . then action 2 on objectA
もうobjectAの名前を繰り返す必要はありません。
例:
touch file.js && openEditor "$1"
またはそのようなもの。
&
は、「タッチ」コマンドをバックグラウンドに送信します。「タッチが成功したらエディターを開く」ことを意図している場合は、&&
代わりに
Ubuntuターミナルで次のようなチェーンアクションを実行できるかどうか疑問に思います。
action 1 on objectA . then action 2 on objectA
もうobjectAの名前を繰り返す必要はありません。
例:
touch file.js && openEditor "$1"
またはそのようなもの。
&
は、「タッチ」コマンドをバックグラウンドに送信します。「タッチが成功したらエディターを開く」ことを意図している場合は、&&
代わりに
回答:
bash History Expansionを使用すると、!#:n
たとえば次のコマンドを使用して、現在のコマンドラインのn番目の単語を参照できます。
$ touch foobar && ls -l !#:1
touch foobar && ls -l foobar
-rw-rw---- 1 steeldriver steeldriver 0 Jun 20 14:54 foobar
$ touch foo bar && ls -l !#:2
touch foo bar && ls -l bar
-rw-rw-r-- 1 steeldriver steeldriver 12 Jun 20 14:58 bar
GNU bash, version 4.3.48(1)-release
touch foo bar && ls -l !#:1-2
!
文字は、あなたがしている際に履歴展開式を導入し、インタラクティブシェルで、それはあなたがしているタイピングとしてオンザフライコマンドライン操作のためのものだ、と無効内部非対話型スクリプトです-
arg1=file.js; touch "$arg1" && openEditor "$arg1"
一般的なユースケースには便利なショートカットがあります。あなたの例では:
$ touch file.js
$ openEditor <alt>+<.>
2番目のコマンドの秘trickは、openEditor
(後にスペースを付けて)書き込み、その後にAlt+を付けること.です。これにより、最後のコマンドの最後の引数が挿入されます。file.js
ます。(Alt何らかの理由で動作しない場合はEsc、同様に動作するはずです。)
多くの場合、「オブジェクト」は実際に前のコマンドの最後の引数であるため、頻繁に使用できます。覚えやすく、直観的に使用される一連のシェルショートカットにすばやく統合できます。
これでできることはたくさんあります。可能性についての詳細な記事は次のとおりです。 ます。 https //stackoverflow.com/questions/4009412/how-to-use-arguments-from-previous-command
ボーナスとして、これはbashだけでなく、コマンドライン入力の処理にlibreadlineを使用するすべてのプログラムで機能します。
echo 1 2 3 4
し、私がしたい2
と3
、次のコマンドのために
Alt
and type 2.
、スペースバーを押し、ホールドAlt
して入力3.
-範囲が必要な場合は、履歴展開を使用します!!:2-3
。
デフォルトの対話型シェルbash
およびスクリプトシェルに関する限り、最後のコマンドの最後の引数を呼び出すdash
ために使用できます。$_
$ echo "Hello World"; echo same "$_"
Hello World
same Hello World
cshとtcshには履歴参照があります。特にコマンドの最後の単語については、を使用でき!$
、個々の引数については-を使用できます!:<index>
。
~% echo foo bar
foo bar
~% echo !$
echo bar
bar
% echo bar baz
bar baz
% echo !:1
echo bar
bar
一般objectA
に、変数に何でも割り当てて、複数のコマンド、ループなどで使用することをお勧めします。代わりに、関数を選択することもできます。
$ foo(){ echo "$@"; stat --print="%F\n" "$@";}
$ foo testdir
testdir
directory
$_
場合!#:n
とは少し異なる動作をすることを指摘したいと思います。だから、歴史の中で起こって背中はまだでコマンド表示されるでしょう$_
しばらくは!#:n
その実際の値に置き換えされていたであろう。どちらにも長所と短所があります。
$_
ように引用符で囲む必要があります。そうしないと、他のすべてのように分割されてグロブされます。(echo
引数を単一のスペースで結合しているため、ここでは表示されません。)しかし、たとえばtouch "hello there"; ls -l $_
動作しません。
$_
は、ポータブルだということです。結局のところ、!#:n
bash固有です。
steeldriver's answerに記載されている歴史的アプローチに反対することをお勧めします。これは、常に脆弱なグローバル状態に依存しています。
より適切なのは、適切な変数を使用して、必要なすべてのコマンドをループ処理することです。
$ for c in touch gedit; do $c foo.txt; done
一般的に少し問題なのは、障害が発生してもBashが中断しないことです。つまり、これはtouch foo.txt; gedit foo.txt
で連鎖する代わりに実際に動作し&&
ます。したがって、安全にするために、次を追加できますbreak
。
$ for c in touch gedit; do $c foo.txt || break; done
ワンライナーを作成するとき、コマンドで複数回使用するシェル変数に繰り返しを割り当てます。上矢印、control + a、control + right-arrowの異なる引数を使用して、カーソルをに近づけるように呼び出して編集することができますt=
。
t=testloop; asm-link -d "$t.asm" && perf stat -r2 ./"$t"
これにより、拡張機能や名前のバリエーションを簡単に追加できることに注意してください。
また;
、変数の割り当て後にvar=value cmd
コマンドが必要になることに注意してください。これは、それをそのコマンドの環境変数として設定するだけで、シェルコンテキストには影響しないからです。