同じパラメータを持つ複数のコマンドを1行に変換する方法を探しています。

同じパラメータを持つ複数のコマンドを1行に変換する方法を探しています。

私は時々次のことをします。

はい:

~から~/blah

$ mkdir ~/test-tmp
$ cp * ~/test-tmp
$ cd ~/test-tmp

ターゲットディレクトリを3回連続して使用します。これを1行のコマンドに置き換える方法はありますか?

答え1

これはあなたが言うのですか?

mkdir ~/test-tmp && cp * ~/test-tmp && cd ~/test-tmp

または

function mm() {
  local dir=$1
  if [ ! -z "$dir" ]
  then
    mkdir ~/${dir} && cp * ~/${dir} && cd ~/${dir}
  fi
}

答え2

Bashでは、最後に実行したコマンドの引数が次のファイルに!$書き込まれます。man bash

   !      Start a history substitution, except when followed by  a  blank,
          newline,  carriage return, = or ( (when the extglob shell option
          is enabled using the shopt builtin).
   [...]
   $      The last argument.

だから、あなたはこれを行うことができます

$ mkdir ~/test-tmp ; cp * !$ ; cd !$

または単に

$ mkdir ~/test-tmp
$ cp * !$
$ cd !$

答え3

問題が再入力された場合は、~/test-tmp次の手順を実行してコマンドを短縮して1行にまとめることができます。

D=~/test-tmp; mkdir $D; cp * $D; cd $D

パスにスペースが含まれている場合は、ジョブを引用する必要があります。そして変数を使用する場所:

D="~/test tmp"; mkdir "$D" ; cp * "$D"; cd "$D"

関連情報