Jawaban:
Alias adalah seperti perintah di mana semua argumen mereka dilewatkan sebagai argumen untuk program yang mereka alias. Misalnya, jika Anda adalah untuk alias ls
untuk ls -la
, kemudian mengetik ls foo bar
akan benar-benar mengeksekusi ls -la foo bar
pada baris perintah.
Jika Anda ingin memiliki kontrol aktual atas bagaimana argumen ditafsirkan, maka Anda bisa menulis fungsi seperti ini:
my_program_wrapper() {
local first_arg="$1" \
second_arg="$2"
shift 2 # get rid of the first two arguments
# ...
/path/to/my_program "$@"
}
Solusi Alias
Jika Anda benar-benar menentang penggunaan fungsi, Anda dapat menggunakan:
$ alias wrap_args='f(){ echo before "$@" after; unset -f f; }; f'
$ wrap_args x y z
before x y z after
Anda dapat mengganti $@
dengan $1
jika Anda hanya menginginkan argumen pertama.
Penjelasan
Ini menciptakan fungsi sementara f
, yang meneruskan argumen.
Argumen Alias hanya disahkan pada bagian akhir. Catatan yang f
disebut di paling akhir alias.
The unset -f
menghilangkan definisi fungsi sebagai alias dijalankan sehingga tidak berkeliaran setelah itu.
wrap_args x y z
memberi saya: bash: kesalahan sintaksis dekat token yang tidak terduga `('
f
alias. Setelah saya unaliased f
itu berfungsi dengan baik. Tabrakan nama lama.
command type f
:)
Menambahkan ke jawaban sekarang, satu hal penting untuk disadari tentang bagaimana alias bekerja adalah bahwa semua parameter yang Anda ketikkan setelah perintah alias akan digunakan secara harfiah di akhir. Jadi tidak ada cara untuk menggunakan alias untuk dua perintah (disalurkan atau tidak), dari yang pertama harus menafsirkan parameter. Untuk memperjelasnya, inilah contoh sesuatu yang tidak akan berfungsi seperti yang diharapkan:
alias lsswp="ls -l | grep swp"
(contoh terinspirasi oleh pertanyaan ini ) ini akan selalu menggunakan output yang ls -l
dilakukan di direktori saat ini dan melakukan grep pada itu - jadi menggunakan
lsswp / tmp /
akan setara dengan ls -l | grep swp /tmp/
dan tidak ls -l /tmp/ | grep swp
.
Untuk semua keperluan di mana argumen harus digunakan di suatu tempat di tengah, orang perlu menggunakan function
bukan alias
.
Anda tidak harus melakukan apa pun, sebenarnya; alias melakukan ini secara otomatis. Misalnya:
$ alias less="less -eirqM"
$ less foo.txt
Anda akan melihat halaman pertama foo.txt, dan less
akan berhenti di EOF (-e), pencarian akan case-sensitive (-i), dll.
Saya menjawab untuk csh:
Ya, Anda dapat menggunakan parameter dalam alias dan - sebagai perbedaan dengan apa yang telah dikatakan di atas - Anda dapat merujuknya di mana saja dalam definisi alias - tidak hanya di bagian akhir.
Contoh untuk tar-gz -ing sesuatu:
$ alias tgz "tar cvf - \!:1 | gzip -9 > \!:2.tar.gz"
, di mana !:1
dan !:2
adalah parameter yang akan Anda berikan saat memanggil alias Anda.
Contoh penggunaan:
$ ls
clrcf.dat user_comment_2016.06.03_12:51:50.txt user_comment_2016.06.03_12:54:48.txt
TEST-wADM.tec user_comment_2016.06.03_12:52:04.txt user_comment_2016.06.03_12:55:13.txt
$ tgz user* out
a user_comment_2016.06.03_12:51:50.txt 1K
a user_comment_2016.06.03_12:52:04.txt 1K
a user_comment_2016.06.03_12:54:48.txt 1K
a user_comment_2016.06.03_12:55:13.txt 1K
$ ls out*
out.tar.gz
Yang secara efektif berarti bahwa Anda menggunakan dua parameter yang Anda masukkan di tempat sewenang-wenang dari perintah tar, menjadikan semuanya sebagai alias tgz
sh
didefinisikanmy_program_wrapper() { ...; }
. Bash memang menangani kata kuncifunction
tetapi mengapa tidak menggunakan yang lebih portabel?