Saya menggunakan Bash sebagai shell interaktif saya dan saya bertanya-tanya apakah ada cara mudah untuk membuat Bash menjalankan perintah sistem alih-alih perintah shell builtin dalam kasus di mana mereka berdua memiliki nama yang sama.
Sebagai contoh, gunakan sistem kill
(dari util-linux
) untuk mencetak id proses (pid) dari proses yang disebutkan (es) alih-alih mengirim sinyal:
$ /bin/kill -p httpd
2617
...
Tanpa menentukan path lengkap dari perintah sistem, Bash builtin digunakan sebagai ganti perintah sistem. The kill
builtin tidak memiliki -p
pilihan sehingga perintah gagal:
$ kill -p httpd
bash: kill: p: invalid signal specification
Saya mencoba jawaban yang tercantum di Make bash menggunakan perintah `time` eksternal daripada built-in shell tetapi kebanyakan dari mereka hanya bekerja karena time
sebenarnya kata kunci shell - bukan builtin shell .
Selain menonaktifkan Bash bawaan untuk sementara enable -n kill
, solusi terbaik yang saya lihat sejauh ini adalah menggunakan:
$(which kill) -p httpd
Apakah ada cara lain yang lebih mudah (melibatkan lebih sedikit pengetikan) untuk mengeksekusi perintah eksternal daripada menggunakan shell?
Catatan itu kill
hanyalah sebuah contoh dan saya ingin solusi umum yang mirip dengan cara awalan dengan command
builtin mencegah fungsi yang memiliki nama yang sama dengan perintah eksternal dijalankan. Dalam kebanyakan kasus, saya biasanya lebih suka menggunakan versi builtin karena menghemat forking proses baru dan beberapa kali builtin memiliki fitur yang tidak dimiliki perintah eksternal.
sumber
which kill
di backticks (tidak bisa memasukkannya ke dalam komentar) sedikit lebih pendek.$(…)
- lihat ini , ini , dan ini .Jawaban:
Dengan asumsi
env
ada di jalur Anda:env
menjalankan file yang dapat dieksekusi yang dinamai dengan argumen pertamanya di lingkungan yang (mungkin) dimodifikasi; karena itu, ia tidak tahu tentang atau bekerja dengan perintah built-in shell.Ini menghasilkan beberapa kontrol kontrol pekerjaan shell, tetapi tidak bergantung pada perintah eksternal:
exec
membutuhkan executable untuk mengganti shell saat ini, jadi tidak menggunakan built-in. Pekerjaan dijalankan di latar belakang sehingga Anda mengganti shell latar bercabang, bukan shell Anda saat ini.sumber
env
jelas merupakan jawaban IMHO yang tepat.command -p cmd
memanggil perintah eksternalzsh
, bukanbash
.(exec kill -p http)
menyebabkan pekerjaan mengganti sub-shell alih-alih shell Anda saat ini dan Anda tidak harus berurusan dengan cruft kontrol pekerjaan.env
juga tidak tahu tentang builtin shell, karena itu bukan shell. Anda akan mendapatkan efek yang sama dengannice
atauxargs
atau program lain seperti itu.Cara paling sederhana untuk melakukan apa yang Anda inginkan adalah dengan meletakkan garis
ke dalam
~/.bashrc
file Anda . Setelah itu, setiap login / doa baru dari bash akan menafsirkan "bunuh" sebagai/bin/kill
.sumber
command
solusi) daripada membuat alias terpisah untuk setiap perintah "dibayangi". Sekarang saya telah mengedit pertanyaan saya untuk membuatnya lebih jelas dan lebih eksplisit. Dalam kebanyakan kasus, saya biasanya lebih suka menggunakan versi builtin karena proses dapat ditentukan oleh ID pekerjaan. Bagaimanapun, terima kasih.Jika Anda tahu solusi yang membutuhkan pengetikan dan Anda menginginkan solusi yang membutuhkan pengetikan yang lebih sedikit, buatlah:
Menyingkat hal-hal yang biasanya membutuhkan usaha adalah keunggulan komputer.
sumber
Dalam kasus yang sangat spesifik ini, perintahnya
pgrep
sama dengan kebutuhan.Secara umum, fungsi bekerja. Dari "perintah file":
panggilan sebagai
Tetapi jika Anda perlu mengetik lebih sedikit, tidak ada cara yang lebih pendek dari alias yang baik.
Dari konsep "daftar pid" (lp):
lalu ketikkan:
sumber
(Dalam zsh) Anda dapat mengawali nama perintah apa pun dengan tanda = untuk mendapatkan versi sistem alih-alih builtin. Ini juga merupakan cara praktis untuk menghindari alias apa pun yang mengacaukan skenario tertentu.
sumber
zsh
satunya. Saya menggunakannya secara teratur tetapi saya akan memeriksabash
dari komputer besok.zsh
. Sementara saya menandai pertanyaan ini denganbash
dan menggunakannya dalam judul, Anda harus menyimpan jawaban ini karena pengguna zsh tetap akan menemukan manfaatnya.Anda dapat mengirim laporan bug terhadap
kill
halaman manual Anda dan bertanya mengapa ini termasuk opsi non-standar yang diambilpkill
dan digunakanpkill
kapan pun Anda ingin mendapatkan fitur daripkill.
Jika Anda menelepon:
pkill httpd
Anda menghindari masalah yang Anda gambarkan.
sumber