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


11

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

次のようなものですapt up{date,grade}


実際にこれを達成する目的は何でしょうか?なぜこれが興味深い/関連するのでしょうか?
バナジウム

25
@vanadium我々はLinuxユーザですが、無意味な事をしようとすると、私たちのどれもが今までなかった場合は、私たちのことみましょうことが正直どれもここにないだろう、私たちはより複雑なものに後から適用することができる技術を習得することができます
ダレンH

1
@DarrenHそれは私が本当に思ったものです:
バナジウム

回答:


19

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

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

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

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 aptsudoおよびsh非常に多くの分岐のために効率的ではありません):

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

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

$ 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、実際のコマンド実行を行わずに実行することを忘れないでください


7
forループを1行で実行するだけです。for i in {date,grade}; do sudo apt up${i}; done
Videonauth

3
ファイルをきれいに整頓したい場合は、にエイリアスを入れることもでき~/.bash_aliasesます。このファイルはによって自動的に取得され~/.bashrcます。
francescop21

2
おそらくあなたが望むもので私の答えを更新しました。それはワンライナーですが、それがそれをもっと簡単にするかどうかとは思いません。あなたは(はい、それは2つの2つのコマンドを実行したいとき率直には、これを行うにはポイントがありませんapt異なる引数を持つコマンド)(更新とアップグレード)ので、私はまだループのために言うよ進むべき道である
Sergiy Kolodyazhnyy

1
ループヘッダの中の文字列の拡張のための必要はありません、ただの反復に名前を付けていない:for i in date grade; do
rexkogitans

5
このようなエイリアスには、明らかに名前を付ける必要がありますupgrate
パイプ

14

bash 履歴展開を使用して、現在のコマンドラインの一部を取得して変更することもできます。

$ apt update; !#:s/date/grade
apt update; apt upgrade;
Reading package lists... Done
...
  • !# 現在の行です
  • :s/date/gradeその代替修飾子であるdategrade

6
あなたも、使用して2つの以上の文字を保存することができます!#:s/dat/grad代わりに
ダン

9

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

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

テスト:

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

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


1
非常に素晴らしい。テーマのバリエーションprintf "%s\n" {date,grade} | xargs -I% -n1 echo apt up%は少し長いかもしれませんが
Sergiy Kolodyazhnyy

printf '%s'--helpまたはでエスケープできないため、一般的には良い方法です-e
yyny

@YoYoYonnYはい。おそらくprintf '%s\0'もっと良いでしょう、xargsnullで終わる引数を処理するフラグがあります
Sergiy Kolodyazhnyy

2

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

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

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

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

alias apt-up='apt update && apt upgrade'

0

@muruの答えは、私が歴史の拡張について読むことにつながり、別の変種を見つけました

 $ sudo apt update
 $ ^dat^grad^

^string1^string2^同等であり!!:s/string1/string2/、最後のコマンドと置き換えを取る、string1とはstring2


-2

apt-get up次のキーシーケンスを使用して、コマンドの一部を再利用します。

Up ArrowBackspaceBackspaceBackspaceBackspace

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