異なるパラメーターで同じコマンドを実行する


8

私は協力するのにそれほど寛容ではないプログラムを持っています。残念ながら、このプログラムは以下を許可していません

"command -a -b -c"

または

"command -abc"

だから私はいつも次のようにタイプしなければなりません

command -a && command -b && command -c

タイプするより効率的な方法があると確信していますが、それを理解することはできません。


5
これは完全にコマンドに依存します。質問に含めてください。
joepd 2016年

1
あなたは多くの異なる答えを持っていますがcmd -a; cmd -b; cmd -c、すべての人間がそうであるように、あなたは長期的には固執するでしょう。
jimmij

この質問は広範すぎて、詳細はありませんcommand。一般的なケースでは、command -a -b -ccommand -abcおよびcommand -a && command -b && command -c異なる意味を持っている...
ドミトリーGrigoryev

回答:


14

あなたはできる:

echo -a -b -c | xargs -n 1 command

または:

xargs -n1 command <<< '-a -b -c'

いくつかのシェルで。

ただし、これはの標準入力に影響することに注意してくださいcommand

zsh

autoload zargs # best in ~/.zshrc
zargs -n 1 -- -a -b -c -- command

または単に:

for o (-a -b -c) command $o

command呼び出しのいずれかが失敗した場合(255の終了ステータスで失敗した場合を除いて)、それらのいずれも中止されません。

そのためには、次のようにします。

for o (-a -b -c) command $o || break

それでも$?、失敗したcommand呼び出しの終了ステータスに失敗します)。これを次のように変更できます。

(){for o (-a -b -c) command $o || return}

しかし、その時までに、それはすでにより長くなっています:

command -a && command -b && command -c

このオプションをご利用いただきありがとうございます。!!:0とxargsの組み合わせがうまくいきました。
Douda

10

前のコマンドラインの最初の単語(このcommand場合)を履歴の展開!!:0で参照し、必要な引数を追加するだけです。

command -a && !!:0 -b && !!:0 -c

例えば:

% echo foobar && !!:0 spamegg && !!:0 baz    
echo foobar && echo spamegg && echo baz
foobar
spamegg
baz

StéphaneChazelasが指摘したように、これは予期しない拡張にもつながる可能性があることに注意してください。


1
まさに私が必要としたもの!ずっとheemayl VEYありがとう
Douda

2
!!:0(csh履歴展開をサポートするシェルでは)前のコマンドではなく、前のコマンドラインの最初の単語に展開されます。
ステファンChazelas

@StéphaneChazelasが明確になりました
。– heemayl

前のコマンドラインの最初の単語が何であったかわかりません。入力しようとするunameと、echo foobar && !!:0 spamegg && !!:0 bazに展開されecho foobar && uname spamegg && uname bazます。
ステファンChazelas

2
1つ!で十分です!:0が、@StéphaneChazelasポイントでは、コマンドライン全体でこれまでに入力し!#:0!#平均値を使用する方が良いでしょう。
Costas

3

ループをラップするシェル関数はどうですか?

yourcmd() {
    local arg
    for arg; do
        thing "$arg" || return
    done
}

「thing」は、呼び出したい実際のコマンドです。その後、単に

yourcmd -a -b -c

これを任意のコマンドに一般化することもできます。

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

その後

splitargs somecommand -a -b -c

1

創造的で洞察に満ちた答えの中で、入力する文字を少なくするという名前の簡単なものを以下に示します。

# under the assumption that you have a frequently-used set of flags: -a -b -c
alias c='command -a && command -b && command -c'

# slightly more generally, name some aliases according to the set of flags
alias cabc='command -a && command -b && command -c'
alias cdef='command -d && command -e && command -f'

# more generally, just shorten the command name and then pass whatever flags you want
alias c=command
c -e && c -f && c -f

0

シェルスクリプトMultiRunを作成します。これは、最初のパラメーターをコマンドとして受け取り、残りのパラメーターを使用してこれを一度に1つ実行します。

./ MultiRun curl ABCD

スクリプトはcurlをコマンドとして取り、「curl A」、「curl B」、「curl C」、「curl D」を実行する必要があります。これで、スクリプトが制御されているため、1つのコマンドでエラーが発生した場合にスクリプトを終了するか、次のパラメーターに進むか、ユーザー入力などを待つかを決定できます。個々のコマンドの実行に基づいて、スクリプト全体の終了ステータスを決定することもできます。

MultiRunスクリプトは次のようになります。

#! /bin/bash
COMMAND=$1
shift #### Remove COMMAND from existing Parameters
for PARAMETER in "$@" ; #### Process all remaining Parameters
do
  # echo Executing "$COMMAND $PARAMETER" now #### Uncomment this line to see what command is getting executed.
  $COMMAND $PARAMETER
  # Check exit status and take action or wait for user input , if required.
  # read -p "finished executing command. press enter to continue. waiting..." #### Uncomment this line to pause between commands.
done
# Depending on the individual exit statuses , choose your exit status N with "exit $N".


./MultiRun echo 1 2 3 4
を実行して、「echo 1」、「echo 2」、「echo 3」、「echo 4」の出力を次のように取得します
。1
2
3
4

これは非常に柔軟で再利用可能なソリューションです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.