Cara menggunakan kembali apt up
bagian dari apt update
dan apt upgrade
perintah untuk menjalankan kedua perintah secara berurutan hanya dalam satu baris tanpa alias.
Sesuatu seperti: apt up{date,grade}
.
Cara menggunakan kembali apt up
bagian dari apt update
dan apt upgrade
perintah untuk menjalankan kedua perintah secara berurutan hanya dalam satu baris tanpa alias.
Sesuatu seperti: apt up{date,grade}
.
Jawaban:
Cara sederhana (dan lebih efisien) adalah melalui for loop (pada satu baris tetapi di sini ditunjukkan dalam beberapa baris untuk kejelasan):
for i in {date,grade}; do
apt up${i}
done
Cara cerdas adalah membuat alias di ~/.bashrc
untuk dua perintah ini dan lupa mengetik ulang lagi:
alias upgrade=' sudo apt update && sudo apt upgrade'
Cara rumit untuk melakukan ini:
$ echo sudo" "apt" "up{"date","grade"}" && " :
sudo apt update && sudo apt upgrade && :
Lihat apa yang terjadi? Kami sedang membangun string teks yang valid untuk dijalankan oleh shell. Sekarang yang perlu Anda lakukan adalah menggunakan eval
alih-alih echo
. Tetapi eval
umumnya tidak direkomendasikan dalam skrip shell dan perintah ini jauh lebih berbelit-belit dan tidak portabel daripada for loop. Variasi pada tema tanpa eval (dan terpendek sejauh ini, tetapi tidak efisien karena pipa dan banyak perintah echo
, dua apt
, sudo
dan sh
begitu banyak forking):
$ echo "apt "{update,upgrade}";"|sudo sh
Kita juga dapat menggunakan set
untuk mengubah urutan yang diinginkan menjadi parameter posisi dan jalankan apt
dengan $1
dan $2
args:
$ set {update,upgrade}; echo apt $1 && echo apt $2
apt update
apt upgrade
Atau gunakan lagi untuk loop, karena default untuk memproses parameter posisi jika Anda tidak menentukan urutan dalam for variable (sequence)
$ set {update,upgrade} ; for i; do echo apt $i ;done
apt update
apt upgrade
Menggunakan set
adalah teknik yang sangat umum yang saya lihat di kalangan profesional yang sering bekerja dengan kerang, dan untuk alasan yang baik - ini sangat portabel dan akan bekerja di /bin/sh
mana Anda tidak memiliki array atau {a,b,c}
ekspansi. Jadi cara POSIX-ly portabel akan set update upgrade ; for i; do echo apt $i ;done
. Selain itu, ini harus efisien.
Atau kita bisa menuju while
rute loop:
$ echo {date,$'\n',grade}|while read i;do echo apt up${i}; done
apt update
apt upgrade
Tentu saja ingat untuk menjalankannya tanpa echo
eksekusi perintah yang sebenarnya terjadi
for i in {date,grade}; do sudo apt up${i}; done
~/.bash_aliases
. File ini harus diambil secara otomatis oleh ~/.bashrc
.
apt
perintah) dengan argumen yang berbeda (perbarui dan tingkatkan), jadi saya masih akan mengatakan untuk loop adalah cara untuk pergi
for i in date grade; do
upgrate
.
Anda juga dapat menggunakan ekspansi bash history untuk mendapatkan bagian dari baris perintah saat ini dan memodifikasinya:
$ apt update; !#:s/date/grade
apt update; apt upgrade;
Reading package lists... Done
...
!#
adalah baris saat ini:s/date/grade
adalah pengubah yang pengganti date
dengangrade
!#:s/dat/grad
bukannya
Pilihan sederhana lain menggunakan xargs
bukan for
:
echo up{dat,grad}e | xargs -n1 apt
Uji:
$ echo up{dat,grad}e | xargs -n1 echo apt
apt update
apt upgrade
Namun, saya lebih suka shell alias seperti Sergiy karena cara-cara "sederhana" ini tidak cukup sederhana untuk benar-benar bermanfaat.
printf "%s\n" {date,grade} | xargs -I% -n1 echo apt up%
meskipun ini sedikit lebih lama
printf '%s'
umumnya merupakan praktik yang baik karena Anda tidak dapat menghindarinya, misalnya dengan --help
atau -e
.
printf '%s\0'
akan lebih baik, xargs
memiliki bendera untuk menangani argumen yang dihentikan nol
Buat fungsi seperti ini:
repeat() {
for suffix in "${@:2}";
do
eval "$1""$suffix";
done
}
Maka Anda bisa lari repeat 'apt up' {date,grade}
. Ini memiliki manfaat menjadi dapat digunakan kembali untuk perintah yang sama sekali berbeda, meskipun Anda tidak perlu mengetik untuk yang ini.
Saya pasti setuju dengan beberapa jawaban lain bahwa sesuatu seperti ini mungkin lebih bermanfaat:
alias apt-up='apt update && apt upgrade'
Jawaban @ muru membuat saya membaca tentang ekspansi sejarah dan saya menemukan varian lain
$ sudo apt update
$ ^dat^grad^
^string1^string2^
setara dengan !!:s/string1/string2/
, yang mengambil perintah terakhir dan diganti string1
dengan string2
.