Script yang dipermasalahkan mengakhiri proses terbaru pada localhost port 8080 saya.
#!/bin/bash
x=$(lsof -i:8080 | tail -1 | awk '{print $2}')
kill -9 $x
Itu tidak bekerja, jika skrip itu bernama 'killl' (mengerti? Kill Latest?). Itu memberi saya prompt untuk cmdsubst>
Mengganti nama skrip ke 'asdf', semuanya berfungsi. Apakah ada penjelasan untuk perilaku ini? Saya menggunakan MacOS El Capitán.
shell-script
osx
Zeick
sumber
sumber
killl
?killl
dapat disalahartikan sebagai salah diejakill
. Lebih baik eksplisit dan lebih deskriptif:kill_latest
ataukill_last
.type killl
dalam shell di mana Anda mencoba memulainya?Jawaban:
cmdsubst>
adalah prompt sekunder yang dicetak olehzsh
shell ketika menunggu akhir dari substitusi perintah yang dimasukkan.Jika Anda mendapatkan prompt itu setelah hanya memasukkan
killl<Return>
, maka satu-satunya penjelasan yang masuk akal adalah bahwa Anda memiliki alias (yang merupakan beberapa bentuk ekspansi makro string) untukkilll
yang memperluas ke sesuatu yang berisi$(...)
substitusi perintah yang tidak ditentukan , seperti:Di mana
zsh
meminta Anda untuk menutup$(...)
substitusi perintah itu.Beberapa catatan lagi:
lsof
diurutkan berdasarkan pid. nomor pid dibungkus, pid yang lebih besar bukan jaminan bahwa proses itu dimulai nanti.-i:8080
akan melaporkan soket TCP atau UDP yang memiliki port 8080 sebagai port sumber atau tujuan, baik itu soket yang mendengarkan, menerima, atau menghubungkan.-t
opsilsof
:lsof -ti:8080 | tail -n2
kill -9
adalahkill -s KILL
, yang mengirimkan sinyal bahwa aplikasi tidak dapat bertindak untuk keluar dengan anggun. Seharusnya hanya digunakan sebagai pilihan terakhir.Untuk membunuh proses yang paling baru dimulai yang memiliki soket terikat (di kedua ujungnya) pada port 8080, Anda dapat melakukan:
(mengasumsikan GNU
sort
(seperti yang ditemukan pada macOS) danps
implementasi yang mendukunglstart
kolom (seperti macOS 'dan procps-ng, meskipun kode harus diperbarui untuk procps-ng di mana bidang bulan dan hari ditukar)).sumber
Karena ketika Anda mengetik perintah, Anda tidak mengetik
Anda mengetik atau serupa. Ini tidak ada hubungannya dengan nama naskah, atau bahkan itu adalah naskah di tempat pertama. Anda bisa mencapai efek yang sama dengan perintah yang sama sekali tidak ada: Pengurai shell mengharapkan lebih banyak input untuk menyelesaikan satu-satunya perintah yang sebagian lengkap. Pemikiran Anda tentang nama skrip adalah herring merah lengkap.sumber
killl $(
karena suatu alasan, dan sangat tidak mungkin dia melakukannya. Jawaban Stéphane Chazelas lebih mungkin terjadi.`
lebih mungkin daripada$(
.`
tidak mungkin sama sekali karena tidak memberikan prompt yang sama . Cobalah. Tidak, Herhtar; itu bukan asumsi ketika mengetik itu atau serupa adalah cara untuk mendapatkan prompt itu . Itu adalah deduksi.killl
," ketika seperti yang dijelaskan oleh Stéphane Chazelas, sangat mungkin OP memang mengetikkilll
. Karenanya, saya salah menganggap jawaban Anda salah.