Apakah ada cara untuk program baris perintah yang dikompilasi untuk memberi tahu bash atau csh bahwa ia tidak ingin karakter wildcard dalam parameternya diperluas?
Misalnya, seseorang mungkin menginginkan perintah shell seperti:
foo *
untuk mengembalikan nilai ASCII numerik dari karakter tersebut.
pwd
,echo *
hanya*
nullglob
dinonaktifkan, kata dibiarkan tidak berubah. Jikanullglob
opsi ditetapkan, dan tidak ada yang cocok, kata tersebut akan dihapus."set -f
? Apakah ituunset -f
?set +f
Meskipun benar bahwa sebuah perintah itu sendiri tidak dapat mematikan globbing, ada kemungkinan bagi pengguna untuk memberi tahu shell Unix agar tidak menggunakan perintah tertentu. Ini biasanya dilakukan dengan mengedit file konfigurasi shell. Dengan asumsi perintah
foo
dapat ditemukan di sepanjang jalur perintah, berikut ini perlu ditambahkan ke file konfigurasi yang sesuai:Untuk cangkang sh, bash, dan ksh:
alias foo='set -f;foo';foo(){ command foo "$@";set +f;}
Untuk csh dan tcsh shell:
alias foo 'set noglob;\foo \!*;unset noglob'
Untuk shell zsh:
alias foo='noglob foo'
Jalur perintah tidak harus digunakan. Katakanlah perintah foo disimpan di direktori ~ / bin, maka di atas akan menjadi:
Untuk cangkang sh, bash, dan ksh:
alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}
Untuk csh dan tcsh shell:
alias foo 'set noglob;$home/bin/foo \!*;unset noglob'
Untuk shell zsh:
alias foo='noglob ~/bin/foo'
Semua hal di atas telah diuji menggunakan Apple OSX 10.9.2. Catatan: Saat menyalin kode di atas, berhati-hatilah saat menghapus spasi. Mereka mungkin penting.
Memperbarui:
Geira pengguna telah menunjukkan bahwa dalam kasus shell bash
alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}
bisa diganti dengan
reset_expansion(){ CMD="$1";shift;$CMD "$@";set +f;} alias foo='set -f;reset_expansion ~/bin/foo'
yang menghilangkan kebutuhan akan fungsi foo.
Beberapa situs web yang digunakan untuk membuat dokumen ini:
Unix shell
Meneruskan Argumen Baris Perintah ke Perintah Bash Alias
Csh - C Shell
Perintah Bash Builtin
Perbandingan dengan urutan startup Bourne shell dan csh
Loop Alias di csh
Bagaimana cara meneruskan argumen baris perintah ke alias shell?
Memanggil program ketika fungsi bash memiliki nama yang sama
Variabel shell khusus
C Shell Alias dengan Argumen Baris Perintah
Mencegah Ekspansi Wildcard / Globbing di Shell Scripts
sumber
Perluasan dilakukan oleh shell sebelum program Anda dijalankan. Program Anda tidak memiliki petunjuk apakah perluasan telah terjadi atau tidak.
set -o noglob
akan mematikan ekspansi di shell pemanggilan, tetapi Anda harus melakukan itu sebelumnya Anda menjalankan program Anda.
Alternatifnya adalah mengutip argumen Anda, misalnya
foo "*"
sumber
set -o noglob
untuk menonaktifkan perluasan karakter pengganti.Hati-hati: jika tidak ada nama yang cocok dengan mask, bash meneruskan argumen sebagaimana adanya, tanpa ekspansi!
Proof (pa.py adalah skrip yang sangat sederhana, yang hanya mencetak argumennya):
$ ls f1.cc f2.cc pa.py $ ./pa.py *.cc ['./pa.py', 'f1.cc', 'f2.cc'] $ ./pa.py *.cpp ['./pa.py', '*.cpp']
sumber
set -o nullglob
ataushopt -s failglob
, dan perilaku ini akan berubah (dalam dua cara yang sangat berbeda).