Hanya ingin tahu mengapa ini tidak berhasil
#!/bin/bash
ls /bin
ls !$
Saya berharap untuk menjalankan ls /bin
dua kali, tetapi yang kedua menimbulkan kesalahan karena !$
tidak ditafsirkan
Apakah saya melewatkan sesuatu, atau !$
hanya bekerja di baris perintah?
Saya tidak dapat menemukan bagian yang relevan di man bash
(di mac)
Jawaban:
Riwayat dan perluasan riwayat dinonaktifkan secara default saat shell dijalankan secara non-interaktif.
Anda membutuhkan:
atau:
itu akan memengaruhi semua instance bash yang
script.sh
mungkin berjalan.sumber
bash
berjalanscript.sh
, tetapi juga semuabash
contoh lain yangscript.sh
mungkin akhirnya berjalan (sepertibash
skrip lain ...).bash
yang menjalankan skrip Anda.Hal yang waras untuk dilakukan adalah
atau
atau
Peringatan: perlu diingat bahwa masing-masing dilengkapi dengan beberapa jebakan. Solusi $ _ hanya menangkap argumen tunggal terakhir: sehingga
ls foo bar
akan meninggalkan $ _ berisi adilbar
. Yang menggunakanset
akan menimpa argumen ($1
,$2
, dll). Dan semua ini sebagai tulisan akan bekerja, tetapi ketika digeneralisasikan ke perintah yang lebih kompleks (di mana melarikan diri dan spasi putih), Anda bisa mengalami beberapa kesulitan. Misalnya:ls 'foo bar'
(di mana argumen pathname tunggalfoo bar
berisi dua atau lebih spasi, atau karakter spasi putih lainnya) tidak akan berperilaku benar dalam salah satu dari contoh ini. Pelarian yang benar (mungkin digabungkan denganeval
perintah), atau menggunakan"$@"
alih-alih$*
, mungkin diperlukan untuk mengatasi kasus-kasus itu.sumber
$_
cara adalah tidak portabel, Anda benar. Theset
Pendekatan bekerja di dasbor non-interaktif, dan dengan${1+"$@"}
(ditambah zsh alias global) trik harus umum, meskipun saya samar-samar ingat bahwaset
memiliki sejarah tidak menjadi sempurna portabel dengan beberapa (lama?) Kerang. Pendekatan define-a-variable-holding-the-command-and-then-eval-it, terutama menggunakan pelolosan yang tepat daneval
perintah yang sebenarnya , benar-benar umumnya portabel sejauh yang saya tahu.