Saya mencoba menonton sejumlah file di /tmp/
direktori saya . Untuk ini saya pikir perintah ini akan berhasil:
watch sh -c 'ls /tmp/|wc -l'
Tetapi tampaknya berfungsi seolah-olah ls
tidak punya argumen. Yaitu, saya masuk ~
, dan saya mendapatkan jumlah file di sana, bukan /tmp/
. Saya menemukan solusi, yang tampaknya berhasil:
watch sh -c 'ls\ /tmp/|wc -l'
Tetapi mengapa saya harus lari dari ruang antara ls
dan /tmp/
? Bagaimana perintah diubah oleh watch
sehingga ls
output diumpankan wc
, tetapi /tmp/
tidak diteruskan sebagai argumen ls
?
watch "sh -c 'ls /tmp | wc -l'"
melakukan perintah ini harus mendapatkan efek yang diinginkan. Ini bukan kesalahan jam tangan, cobalahsh -c ls /tmp
dan Anda akan mendapatkan direktori rumah Anda (tapi saya tidak tahu mengapa ...)watch
salah. Perintah yang Anda berikanwatch
pada gilirannya diumpankanwatch
kesh -c
, jadi Anda sebenarnya melakukansh -c
dua kali./tmp
Argumen untuksh
, dalam hal ini, bukan argumen untukls
.Jawaban:
Perbedaannya dapat dilihat melalui
strace
:Dalam kasus backquote,
ls /tmp
dilewatkan sebagai argumen tunggal ke-c
kesh
, yang berjalan seperti yang diharapkan. Tanpa backquote ini, perintahnya adalah kata split ketikawatch
menjalankansh
yang pada gilirannya menjalankan yang disediakansh
, sehingga hanyals
diteruskan sebagai argumen-c
, yang berarti bahwa sub-subsh
hanya akan menjalankanls
perintah kosong , dan daftar isi dari pekerjaan saat ini direktori.Jadi, mengapa komplikasi
sh -c ...
? Kenapa tidak lari sajawatch 'ls /tmp|wc -l'
?sumber
strace
mencobanya.ls /tmp
adalah ..." dan "Tanpa backquote ini , perintahnya adalah ...", dan menggunakanbq
dannobq
sebagai nama file, ketika semua mengacu pada backslash dalamls\ /tmp
perintah Anda .Ada dua kategori utama
watch
perintah (dari yang menjalankan perintah secara berkala,watch
bukan perintah standar, bahkan ada sistem di manawatch
melakukan sesuatu yang sangat berbeda seperti mengintip pada baris tty lain di FreeBSD).Salah satu yang sudah melewati rangkaian argumennya dengan spasi ke shell (itu tidak berlaku panggilan
sh -c <concatenation-of-arguments>
) dan yang hanya menjalankan perintah yang ditentukan dengan argumen yang ditentukan tanpa memanggil shell.Anda berada dalam situasi pertama, jadi Anda hanya perlu:
Saat kamu melakukan:
Anda
watch
benar - benar berjalan:Dan
sh -c ls /tmp/
menjalankanls
skrip inline mana$0
yang/tmp/
(jadils
dijalankan tanpa argumen dan daftar direktori saat ini).Beberapa
watch
implementasi dalam kategori pertama (seperti yang dari procps-ng di Linux) menerima-x
opsi untuk membuat mereka berperilaku seperti yangwatch
dari kategori kedua. Jadi dengan itu, Anda bisa melakukan:sumber