apt up
およびapt update
コマンドのapt upgrade
部分を再利用して、エイリアスなしで1行だけで両方のコマンドを順番に実行する方法。
apt up{date,grade}
のようなもの。
簡単な方法(より効率的な方法)は、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 apt
、Sudo
とsh
が非常に多いため、効率的ではありません) :
$ 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
なしで実行することを忘れないでください。実際のコマンド実行が行われます。
Bash history expansion を使用して、現在のコマンドラインの一部を取得して変更することもできます。
$ apt update; !#:s/date/grade
apt update; apt upgrade;
Reading package lists... Done
...
!#
は現在の行です:s/date/grade
は、date
をgrade
に置き換える修飾子です。xargs
の代わりにfor
を使用する別の単純なオプション:
echo up{dat,grad}e | xargs -n1 apt
テスト:
$ echo up{dat,grad}e | xargs -n1 echo apt
apt update
apt upgrade
ただし、シェルエイリアス Sergiyと同様 を好むでしょう。これらの「単純な」方法は、実際に役立つほど単純ではないからです。
次のような関数を作成します。
repeat() {
for suffix in "${@:2}";
do
eval "$1""$suffix";
done
}
その後、repeat 'apt up' {date,grade}
を実行できます。これには、まったく異なるコマンドで再利用できるという利点がありますが、このコマンドの入力は不要です。
私は確かに、このようなものがおそらくより有用であるという他の回答のいくつかに同意します:
alias apt-up='apt update && apt upgrade'
@muruの答えは history expansion を読むことにつながり、別の変種を見つけました
$ Sudo apt update
$ ^dat^grad^
^string1^string2^
は!!:s/string1/string2/
と同等です。これは最後のコマンドを受け取り、string1
をstring2
に置き換えます。