Saya perlu mem-boot ulang sejumlah mesin dari jarak jauh. Biasanya saya hanya mengeluarkan
for host in <hostlist>;do ssh ${host} 'sudo shutdown -r now';done
Tapi saya ingin memberi pengguna waktu sebelum restart. Namun mereka ssh sesi tidak akan terputus bahkan jika saya menggunakan:
ssh -f 'sudo shutdown -r +5 &;disown'
Saya mendapat pesan kesalahan:
bash: -c: line 0: kesalahan sintaksis dekat token
;' bash: -c: line 0:
sudo shutdown tak terduga -r +5 &; disown '
Ada saran?
&
karakter tidak mengirim perintah di sisi kiri di latar belakang. Begitulah bedanya;
.Jawaban:
Seperti yang dinyatakan oleh pesan kesalahan, Anda memiliki kesalahan sintaksis dalam perintah Anda. Hal ini disebabkan oleh fakta yang sedikit mengejutkan yang
&
bukan merupakan bagian dari perintah shell melainkan pemisah antara perintah (seperti;
). Padahal keduanya adalah pemisah perintah yang&
memiliki efek tambahan pada perintah di sisi kirinya. Ini tentu juga kadang membingungkan saya, dan saya sering membuat kesalahan yang sama. Setelah Anda mengetahuinya, cara ini mudah diperbaiki.Cara mengatasinya adalah tidak menulis
&;
tetapi hanya menulis salah satu dari dua pemisah tergantung pada niat Anda. (Dan dalam kebanyakan kasus di mana seseorang telah menulis&;
niatnya adalah hanya menulis&
).Ini seharusnya bekerja:
sumber
sudo shutdown -r +5 &
di latar belakang dan kemudian berlaridisown
? Bagaimana bash akan menangani situasi seperti itu? Saya berharap ini menjadi sintaks yang sempurna untuk sebuah perintah, bahkan memiliki&;
. Jika;
pemisah perintah, maka Anda memiliki 2 perintah di tangan Anda. Baik?&
akan memulai perintah pertama di latar belakang dan setelah perintah pertama dimulai, perintah kedua akan dijalankan di latar depan.sudo shutdown -r +5 &; disown
tidak tampak seperti sintaks yang buruk. Maksud saya, maksud saya bisa menjalankan bagian pertama di latar belakang dan kemudian bagian 2.sudo shutdown -r +5 &; disown
itu akan dianggap sebagai tiga perintah yang valid dipisahkan oleh&
dan;
. Namun itu berarti bahwa seseorang harus berhati-hati untuk tidak menggunakan pemisah tambahan jika status yang ada dari perintah sebelumnya akan digunakan. Itu berarti bahwa seseorang harus memperhatikan tokenizing juga karena misalnya&&
dan& &
mendapat tokenized berbeda.