Cara menggunakan kembali apt upbagian dari apt updatedan apt upgradeperintah untuk menjalankan kedua perintah secara berurutan hanya dalam satu baris tanpa alias.
Sesuatu seperti: apt up{date,grade}.
Cara menggunakan kembali apt upbagian dari apt updatedan apt upgradeperintah 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 ~/.bashrcuntuk 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 evalalih-alih echo. Tetapi evalumumnya 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, sudodan shbegitu banyak forking):
$ echo "apt "{update,upgrade}";"|sudo sh
Kita juga dapat menggunakan setuntuk mengubah urutan yang diinginkan menjadi parameter posisi dan jalankan aptdengan $1dan $2args:
$ 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 setadalah 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/shmana 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 whilerute loop:
$ echo {date,$'\n',grade}|while read i;do echo apt up${i}; done
apt update
apt upgrade
Tentu saja ingat untuk menjalankannya tanpa echoeksekusi 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.
aptperintah) 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/gradeadalah pengubah yang pengganti datedengangrade!#:s/dat/gradbukannya
Pilihan sederhana lain menggunakan xargsbukan 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 --helpatau -e.
printf '%s\0'akan lebih baik, xargsmemiliki 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 string1dengan string2.