web-dev-qa-db-ja.com

「apt update」コマンドと「apt upgrade」コマンドの「apt up」部分を再利用して、両方を1行で順番に実行する

apt upおよびapt updateコマンドのapt upgrade部分を再利用して、エイリアスなしで1行だけで両方のコマンドを順番に実行する方法。

apt up{date,grade}のようなもの。

11
e200

簡単な方法(より効率的な方法)は、forループ(1行ですが、ここではわかりやすくするために複数行で示しています)を使用しています。

for i in {date,grade}; do
     apt up${i}
done

スマートな方法は、これら2つのコマンドの~/.bashrcでエイリアスを作成し、再度入力するのを忘れることです。

alias upgrade=' Sudo apt update && Sudo apt upgrade'

精巧な方法はこれを行うことです:

$ echo Sudo" "apt" "up{"date","grade"}" && " :
Sudo apt update &&  Sudo apt upgrade &&  :

何が起きているのか見てみましょう?シェルによって実行される有効なテキスト文字列を作成しています。あとは、evalの代わりにechoを使用するだけです。ただし、evalは一般にシェルスクリプトでは推奨されておらず、このコマンドはforループよりも複雑で移植性がありません。 evalを使用しないテーマのバリエーション(これまでで最短ですが、パイプと複数のコマンドecho、two aptSudoshが非常に多いため、効率的ではありません) :

$ echo "apt "{update,upgrade}";"|Sudo sh

setを使用して目的のシーケンスを定位置パラメーターに変換し、$1および$2 argsでaptを実行することもできます。

$ set {update,upgrade}; echo apt $1 && echo apt $2
apt update
apt upgrade

または、代わりにforループを使用します。for variable (sequence)でシーケンスを指定しない場合、デフォルトで位置パラメータを処理するためです。

$ set {update,upgrade} ; for i; do echo apt $i ;done
apt update
apt upgrade

setを使用することは、シェルを頻繁に使用する専門家の間でよく見られる非常に一般的な手法であり、正当な理由で-これは非常に移植性が高く、配列または/bin/sh拡張のない{a,b,c}で機能します。したがって、POSIXに移植可能な方法はset update upgrade ; for i; do echo apt $i ;doneになります。さらに、これは効率的でなければなりません。


または、whileループルートに進むことができます。

$ echo {date,$'\n',grade}|while read i;do echo apt up${i}; done 
apt update
apt upgrade

もちろん、echoなしで実行することを忘れないでください。実際のコマンド実行が行われます。

19

Bash history expansion を使用して、現在のコマンドラインの一部を取得して変更することもできます。

$ apt update; !#:s/date/grade
apt update; apt upgrade;
Reading package lists... Done
...
  • !#は現在の行です
  • :s/date/gradeは、dategradeに置き換える修飾子です。
14
muru

xargsの代わりにforを使用する別の単純なオプション:

echo up{dat,grad}e | xargs -n1 apt

テスト:

$ echo up{dat,grad}e | xargs -n1 echo apt
apt update
apt upgrade

ただし、シェルエイリアス Sergiyと同様 を好むでしょう。これらの「単純な」方法は、実際に役立つほど単純ではないからです。

9
Melebius

次のような関数を作成します。

repeat() { 
    for suffix in "${@:2}";
    do
        eval "$1""$suffix";
    done
}

その後、repeat 'apt up' {date,grade}を実行できます。これには、まったく異なるコマンドで再利用できるという利点がありますが、このコマンドの入力は不要です。

私は確かに、このようなものがおそらくより有用であるという他の回答のいくつかに同意します:

alias apt-up='apt update && apt upgrade'
2
Matthew Read

@muruの答えは history expansion を読むことにつながり、別の変種を見つけました

 $ Sudo apt update
 $ ^dat^grad^

^string1^string2^!!:s/string1/string2/と同等です。これは最後のコマンドを受け取り、string1string2に置き換えます。

0
guntbert