Bagaimana cara mengirimkan parameter ke alias?

64

Untuk skrip bash, saya dapat menggunakan "$@"untuk mengakses argumen. Apa yang setara ketika saya menggunakan alias?

prosseek
sumber

Jawaban:

50

Alias ​​adalah seperti perintah di mana semua argumen mereka dilewatkan sebagai argumen untuk program yang mereka alias. Misalnya, jika Anda adalah untuk alias lsuntuk ls -la, kemudian mengetik ls foo barakan benar-benar mengeksekusi ls -la foo barpada 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 "$@"
}
amphetamachine
sumber
3
opengroup.org/onlinepubs/009695399/utilities/... Fungsi di shdidefinisikan my_program_wrapper() { ...; }. Bash memang menangani kata kunci functiontetapi mengapa tidak menggunakan yang lebih portabel?
ephemient
2
@ephemient Sangat benar. Maksud saya selain fakta bahwa semua orang menggunakan GNU Bash dan bukan shell POSIX barebones.
amphetamachine
21

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 $1jika Anda hanya menginginkan argumen pertama.

Penjelasan

Ini menciptakan fungsi sementara f, yang meneruskan argumen.

Argumen Alias ​​hanya disahkan pada bagian akhir. Catatan yang fdisebut di paling akhir alias.

The unset -fmenghilangkan definisi fungsi sebagai alias dijalankan sehingga tidak berkeliaran setelah itu.

Tom Hale
sumber
Humm? wrap_args x y zmemberi saya: bash: kesalahan sintaksis dekat token yang tidak terduga `('
Tampilan elips
@Elipticalview Hmm, masalah copy paste? Dikonfirmasi mengerjakan bash 4.4.12.
Tom Hale
1
Saya telah falias. Setelah saya unaliased fitu berfungsi dengan baik. Tabrakan nama lama.
Tampilan elips
command type f:)
Tom Hale
1
Bagus! itu varian yang paling malas!
Sergius
19

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 -ldilakukan 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 functionbukan alias.

rozcietrzewiacz
sumber
15

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 lessakan berhenti di EOF (-e), pencarian akan case-sensitive (-i), dll.

Warren Young
sumber
Bisakah Anda melihat pertanyaan saya - tidak ada solusi yang berfungsi untuk saya dan saya tidak diizinkan memulai hadiah.
JJD
1
@JJD Orang yang menjawab pertanyaan Anda benar: Anda ingin fungsi dalam kasus itu, bukan alias. Karena jawaban yang diterima untuk ini pertanyaan pada dasarnya sama, pertanyaan Anda benar ditutup.
Warren Young
1

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 !:1dan !:2adalah 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

stevica
sumber