「&&」の後の「&&」の前のコマンドを参照できますか


10

他にどのように質問を言うかわかりませんが、基本的にvagrant、VMを起動するようなコマンドを実行し、次にsshで次のように実行することがよくあります。

vagrant up && vagrant ssh

独自の関数またはスクリプトを作成する前vagrantに、コマンドの2番目の部分の部分を「再利用」する方法はありますか?


この回答は、関連する質問で役立ちます。unix.stackexchange.com
Bernhard

回答:


23

(t)cshbashまたはzsh履歴の拡張を使用すると、次のように記述できます。

vagrant up && !#:0 ssh

しかし、真剣に、あなたはしません


これは私が探していたものですが、そうです。おそらく、エイリアスや関数を実行する方が簡単です。ありがとう!
jktravis 2014

@glennは何の!#:0略かを説明していただけませんか。0を1、2、または任意の数に置き換えた場合、それは何を意味しますか?
RAM

4
gnu.org/software/bash/manual/bashref.html#History-Interactionは - !#あなたが現在入力している行を参照し、:0ライン(「浮浪者」)の最初の単語です。したがって!#:1、「アップ」などになります
グレン・ジャックマン、2014

4
聖なる牛の人々。私の回答の賛成を停止します。a)「vagrant」を再入力するか、b)最初に「!#:0」を覚えてから入力するために必要な精神的な努力を考慮してください。
グレン・ジャックマン、2014

13

あなたがすることができます:

eval vagrant\ {'up &&',ssh}

しかし、それでは簡単にはなりません。

あなたはいつでも関数を作ることができます

doall() {
  cmd=$1; shift
  for arg do
    "$cmd" "$arg" || return
  done
}

その後:

doall vagrant up ssh

素敵なアプローチです!複数のアプリケーションで使用できるようにするのが好きです。ありがとう!
jktravis 2014

4

直接の回答ではありませんが、2つの代替案を検討する価値があります(コメントとしては多すぎます)。

  1. エイリアス

    コマンドを繰り返し使用する場合は、エイリアスを ~/.bashrc

    alias vassh="vagrant up && vagrant ssh"
  2. コマンドライン履歴

    Ctrl+ R以前のコマンドを検索してみましょう。これは変数を使用するよりもはるかに高速です...


4
 v=vagrant; $v up && $v ssh

それはあなたが探しているものに近いかもしれません。

以下bashは、現在の複合コマンドのコマンド位置の最初の単語を出力する関数です。

rc() { $(set -f; unset IFS
        set -- $(history 1)
        IFS="(){};|'\\\"&#"
        set \ $2;IFS=\ ;set -- $*
        printf %s "$1") "$@"; }

それであなたはできるでしょう:

vagrant up && rc ssh

例:

echo up && rc ssh

出力

up
ssh

または...

set -x
(echo);rc 'times two'

出力

+ echo

+ rc 'times two'
++ set -f
++ unset IFS
+++ history 1
++ set -- 549 '(echo);rc' ''\''times' 'two'\'''
++ IFS='(){};|'\''\"&#'
++ set ' ' echo '' rc
++ IFS=' '
++ set -- echo rc
++ printf %s echo
+ echo 'times two'
times two
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.