Снова используйте 'Кв.' часть 'способного обновления' и 'способного обновления' команды для казни обоих в последовательности во всего одной строке

Как снова использовать apt up часть apt update и apt upgrade команды для выполнения обеих команд в последовательности во всего одной строке без псевдонима.

Что-то как: apt up{date,grade}.

11
задан 22 October 2018 в 00:34

6 ответов

Простой путь (и более эффективный) через для цикла (на одной строке, но здесь это показывают в нескольких строках для ясности):

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

Умный путь состоит в том, чтобы сделать псевдоним в ~/.bashrc для этих двух команд и забывают о перепечатывании его когда-либо снова:

alias upgrade=' sudo apt update && sudo apt upgrade'

Тщательно продуманный путь состоит в том, чтобы сделать это:

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

Посмотрите то, что происходит? Мы создаем допустимую строку текста, который будет выполнен оболочкой. Теперь все, что необходимо сделать, должно использовать eval вместо echo. Но eval обычно не рекомендуется в сценариях оболочки, и эта команда является намного более замысловатой и не портативной, чем для цикла. Вариация на тему без оценки (и самый короткий до сих пор, но не эффективный должный передать по каналу и несколько команд echo, два apt,sudo и sh так большое разветвление):

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

Мы можем также использовать set превратить желаемую последовательность в позиционные параметры и просто выполниться apt с $1 и $2 args:

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

Или альтернативно используйте для цикла снова, так как он принимает значение по умолчанию к обработке позиционных параметров, если Вы не указываете последовательность в for variable (sequence)

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

Используя set очень общая техника, которую я вижу среди профессионалов, которые работают с оболочками много, и на серьезном основании - это очень портативно и будет работать в /bin/sh где у Вас нет массивов или {a,b,c} расширение. Так POSIX-ly портативный путь был бы 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
ответ дан 23 November 2019 в 03:51

Вы также можете использовать bash , расширение истории , чтобы получить части текущей командной строки и изменить ее:

$ apt update; !#:s/date/grade
apt update; apt upgrade;
Reading package lists... Done
...
  • !# - текущая строка
  • :s/date/grade является модификатором, который заменяет date на grade
14
ответ дан 23 November 2019 в 03:51

Еще один простой вариант с использованием xargs вместо for:

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

Тест:

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

Однако я бы предпочел псевдоним оболочки так же, как Сергей , потому что эти «простые» способы не достаточно просты, чтобы быть действительно полезными.

9
ответ дан 23 November 2019 в 03:51

@ ответ Муру привел меня к прочтению расширения истории , и я нашел другой вариант

 $ sudo apt update
 $ ^dat^grad^

^string1^string2^, эквивалентный !!:s/string1/string2/, который принимает последнюю команду и заменяет string1 на string2.

0
ответ дан 23 November 2019 в 03:51

Создайте функцию как это:

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

Затем можно работать repeat 'apt up' {date,grade}. Это обладает преимуществом того, чтобы быть допускающим повторное использование для полностью различных команд, хотя оно не сохраняет Вас никакой ввод для этого.

Я, конечно, согласился бы с некоторыми из других ответов, что что-то вроде этого, вероятно, более полезно:

alias apt-up='apt update && apt upgrade'
2
ответ дан 23 November 2019 в 03:51

Я resuse apt-get up часть команды с помощью следующего сочетания клавиш:

ArrowBackspaceBackspaceBackspaceBackspace

-2
ответ дан 23 November 2019 в 03:51

Другие вопросы по тегам:

Похожие вопросы: