Bagaimana cara meneruskan argumen baris perintah ke alias shell?

288

Bagaimana cara meneruskan argumen baris perintah ke alias? Berikut ini contohnya:

alias mkcd = 'mkdir $ 1; cd $ 1; '

Tetapi dalam kasus ini $ xx diterjemahkan pada alias membuat waktu dan bukan pada saat runtime. Namun, saya telah membuat solusi menggunakan fungsi shell (setelah sedikit Google) seperti di bawah ini:

function mkcd () {
  mkdir $ 1
  cd $ 1
}

Hanya ingin tahu apakah ada cara untuk membuat alias yang menerima parameter CL.
BTW - Saya menggunakan 'bash' sebagai shell default saya.

Vini
sumber
2
Kemungkinan duplikat dari Make a Bash alias yang menggunakan parameter?
tripleee
2
O / T tetapi tentang sebagai alternatif untuk melakukan fungsi mkcd, Anda dapat menulismkdir mydirectoryname && cd $_
moala

Jawaban:

174

Anda menemukan caranya: membuat fungsi alih-alih alias. Shell C memiliki mekanisme untuk melakukan argumen ke alias, tetapi bash dan shell Korn tidak, karena mekanisme fungsinya lebih fleksibel dan menawarkan kemampuan yang sama.

Charlie Martin
sumber
Namun Anda tidak memerlukan fungsi saat membuat alias dalam .bashrcfile. Misalnya # buat alias yang mengambil nomor-port oleh pengguna alias serve = "python -m SimpleHTTPServer $ 1" Setelah melakukan perubahan pada file .bashrc, pastikan Anda memasukkan perintah berikut. ~ $ source .bashrc Anda harus dapat menggunakan ini seperti ini ~ $ serve 8998
kaizer1v
8
@ kaizer1v, Pengamatan saya pada CentOS7.3 bash versi 4.2.46 adalah bahwa saran Anda tidak berfungsi seperti yang Anda pikirkan. Karena Anda menggunakan tanda kutip ganda, $ 1 sebenarnya sedang dievaluasi menjadi string kosong dan alias sebenarnya sama dengan alias serve = "python -m SimpleHTTPServer" dan jadi apa pun yang Anda lewati setelah alias itu JUGA dilewatkan pada baris perintah. Jika Anda mencoba set ini -x; alias melayani = "python -m SimpleHTTPServer $ 1 &" Anda akan melihat kesalahan / masalah. Argumen Anda dan perintah alias dijalankan sebagai perintah terpisah.
PatS
279

Hanya untuk mengulangi apa yang telah diposting untuk cangkang lain, di Bash karya-karya berikut:

alias blah='function _blah(){ echo "First: $1"; echo "Second: $2"; };_blah'

Menjalankan yang berikut ini:

blah one two

Memberikan hasil di bawah ini:

First: one
Second: two
Thomas Bratt
sumber
4
Solusi bagus Beberapa pertanyaan dari pemula bash: Apakah fungsi harus diberi nama dengan garis bawah (atau berbeda sama sekali) atau apakah itu hanya untuk keterbacaan? Apa tujuan dari trailing "; _blah" dalam mendefinisikan fungsi? Mengapa itu tidak bekerja ketika menggunakan tanda kutip ganda di tempat tanda kutip tunggal ($ 1 tidak diartikan dengan benar) bahkan ketika melakukan sesuatu yang tidak memerlukan tanda kutip sekitar $ 1? Terima kasih sebelumnya atas sarannya. Saya memiliki solusi yang berfungsi tetapi selalu ingin lebih memahami mengapa ini berhasil.
mynameispaulie
4
@mynameispaulie Fungsi ini dapat dinamai apa saja. Saya telah menggunakan awalan garis bawah karena ini adalah trik umum untuk membantu mencegah tabrakan nama (yaitu fungsi lain dengan nama yang sama)
Thomas Bratt
6
@mynameispaulie Kutipan ganda memungkinkan Bashuntuk mengganti $1dan $2dengan parameter yang diteruskan ke fungsi. Kutipan tunggal memberi tahu Bash untuk tidak melakukan ini.
Thomas Bratt
5
Saya melihat ini alias / fungsi kombo copy / paste banyak, tetapi sepertinya tidak melayani tujuan yang bermanfaat. Pendekatan standar akan mendefinisikan fungsi sekali, dengan nama waras, dan tidak memiliki alias.
tripleee
16
Saya gagal melihat bagaimana ini lebih disukai daripadafunction blah(){ echo "First: $1"; echo "Second: $2"; }
René Nyffenegger
57

Anda tidak bisa di ksh, tetapi Anda bisa di csh.

alias mkcd 'mkdir \!^; cd \!^1'

Dalam ksh, fungsi adalah cara untuk pergi. Tetapi jika Anda benar-benar ingin menggunakan alias:

alias mkcd='_(){ mkdir $1; cd $1; }; _'
Sanjaya R
sumber
Sebagai catatan tambahan yang menarik, saya berpikir bahwa kerentanan eksekusi kode jauh yang dibicarakan semua orang baru-baru ini melibatkan hampir semua hal yang sama, tetapi dalam variabel lingkungan yang ditetapkan oleh input pengguna mentah. openwall.com/lists/oss-security/2014/09/24/11
Floegipoky
@ Floegipoky - Karena ini dalam alias dan bukan env var, ini sangat berbeda. Masalah ShellShock adalah bahwa itu berjalan ketika env var diatur. Mengatur env var seharusnya merupakan operasi yang aman. Tidak ada skrip dieksekusi ketika alias di atas ditetapkan, hanya ketika alias dijalankan.
Sanjaya R
Mungkin harus ditunjukkan bahwa cshbiasanya bukan apa yang ingin digunakan orang modern. Alias-yang-membuat-fungsi-lalu-mengeksekusi-tipuan fungsi itu relatif populer, tetapi tidak menawarkan manfaat atas fungsi yang tepat sejauh yang saya tahu. (Lagi pula, fungsinya harus mengutip argumennya dengan tepat.) Downvoting
tripleee
17

Mengutip halaman bash man:

Tidak ada mekanisme untuk menggunakan argumen dalam teks pengganti. Jika diperlukan argumen, fungsi shell harus digunakan (lihat FUNGSI di bawah).

Jadi sepertinya Anda telah menjawab pertanyaan Anda sendiri - gunakan fungsi alih-alih alias

Chris Dodd
sumber
12

Anda juga dapat menemukan perintah ini berguna:

mkdir dirname && cd $_

di mana dirname adalah nama direktori yang ingin Anda buat

tdecs
sumber
1
@StarDust $_adalah output dari perintah terakhir unix.stackexchange.com/a/271693/169772
Taylor Edmiston
5

Saya menemukan bahwa fungsi tidak dapat ditulis dalam ~/.cshrcfile. Di sini di alias yang membutuhkan argumen

misalnya, argumen diteruskan ke perintah 'temukan'

alias fl "find . -name '\!:1'"     
Ex: >fl abc

dimana abc adalah argumen yang diloloskan sebagai!: 1

kumar palaniappan
sumber
4
Itu tidak berguna untuk OP, yang shell default-nya adalah bash. Dan jawaban Sanjaya R menyebutkan csh alias 4 tahun yang lalu.
Keith Thompson
1
Jawaban Sanjaya R tidak menjelaskan apa yang !:1dimaksud. Saya harus gulir ke bawah untuk melihat di sini bahwa itu adalah argumen. Jawaban yang bagus tidak meninggalkan banyak pertanyaan, bahkan jika itu bukan untuk jenis shell OPs.
searchengine27
4

Cara termudah, adalah menggunakan fungsi bukan alias. Anda masih dapat memanggil fungsi kapan saja dari cli. Dalam bash, Anda bisa menambahkan fungsi function () {command} itu memuat sama dengan alias.

function mkcd() { mkdir $1; cd $1 ;}

Tidak yakin dengan kerang lainnya

Luke Attard
sumber
1

Ini bekerja di ksh:

$ alias -x mkcd="mkdir \$dirname; cd \$dirname;"
$ alias mkcd
mkcd='mkdir $dirname; cd $dirname;'
$ dirname=aaa 
$ pwd
/tmp   
$ mkcd
$ pwd
/tmp/aaa

Opsi "-x" membuat alias "diekspor" - alias terlihat dalam subkulit.

Dan perhatikan fakta bahwa alias yang didefinisikan dalam skrip tidak terlihat dalam skrip itu (karena alias diperluas ketika skrip dimuat, bukan ketika garis ditafsirkan). Ini dapat diselesaikan dengan mengeksekusi file skrip lain dalam shell yang sama (menggunakan dot).


sumber
-2

Berikut ini contoh fungsi sederhana menggunakan python. Anda dapat menempel pada ~ / .bashrc
Anda harus memiliki spasi setelah kurung kurawal kiri pertama
Perintah python harus dalam tanda kutip ganda untuk mendapatkan substitusi variabel.
Jangan lupa bahwa titik koma di akhir

count fungsi () {python -c "untuk num in xrange ($ 1): print num";}

$ count 6
0
1
2
3
4
5
$
AAAfarmclub
sumber
-5

Alias ​​kosong akan menjalankan argumennya:

alias DEBUG=
Peter Sharp
sumber
12
Saya melihat oleh perwakilan Anda bahwa Anda baru mengenal SO (Stack Overflow). Harap jangan kecewa dengan pemungutan suara jawaban Anda. Sudah ditolak karena benar-benar tidak menjawab pertanyaan yang diminta OP (Poster Asli) untuk dijawab. Gantung mereka dan terus berusaha. Juga ketika menjawab, cobalah untuk memasukkan contoh sederhana tentang bagaimana jawaban Anda bekerja dan tunjukkan hasilnya. Ini akan membantu orang lain melihat bagaimana jawaban Anda bekerja.
PatS