Spasi di sebelah pipa

17

Saya telah melihat history | grep blahdan history |grep blah; dan history|grep blahjuga berfungsi, meskipun sepertinya tidak ada yang menggunakannya.

Apakah ada signifikansi dalam spasi (mis. Pemipaan ke / dari perintah yang berbeda memerlukan penggunaan spasi yang berbeda), atau apakah itu selalu arbitrer?

EmmaV
sumber
13
Keterbacaan, sebagian besar.
jasonwryan
1
|pipa atau ;titik koma digunakan oleh sebagian besar shell (bash, ksh, tcsh) sebagai pemisah perintah. ketika tidak terlampir dalam kutipan ruang putih sebelum dan sesudahnya tidak sopan.
Archemar

Jawaban:

24

bashmendefinisikan beberapa metakarakter . Dari man bash:

metacharacter
Karakter yang, ketika tidak dikutip, memisahkan kata-kata. Salah satu dari yang berikut:
| &; () <> tab spasi

Karena metakarakter memisahkan kata, tidak masalah apakah mereka dikelilingi oleh spasi. Simbol pipa |,, adalah metacharacter dan karenanya, seperti yang Anda perhatikan, tidak memerlukan spasi di sekitarnya.

Perhatikan bahwa [, ], {, }, dan =yang tidak metakarakter. Makna mereka, sebaliknya, sangat bergantung pada apakah mereka dikelilingi oleh kekosongan.

Contoh kapan ruang dan tidak diperlukan

Seperti yang Anda perhatikan, tidak masalah apakah |dikelilingi oleh ruang. Mari kita perhatikan beberapa contoh yang biasanya membingungkan pengguna bash. Mempertimbangkan:

$ (date)
Sun Mar  1 12:47:07 PST 2015

Parens di atas memaksa dateperintah untuk dijalankan dalam subkulit. Karena (dan )merupakan metakarakter, tidak diperlukan spasi. Sebaliknya:

$ {date}
bash: {date}: command not found

Karena {dan }yang tidak metakarakter, memperlakukan shell {date}sebagai satu kata. Alih-alih mencari dateperintah, itu mencari perintah bernama {date}. Karena tidak menemukan satu, hasil kesalahan.

Masalah umum lainnya adalah testperintah. Berikut ini berhasil:

$ [ abc ] && echo Yes
Yes

Hapus spasi dan terjadi kesalahan:

$ [abc] && echo Yes
bash: [abc]: command not found

Karena [dan ]yang tidak metakarakter, shell memperlakukan [.bashrc]sebagai satu kata dan hasilnya, seperti di datecontoh, adalah kesalahan.

Pernyataan penugasan juga sensitif terhadap spasi. Tugas berikut berhasil:

$ v=date
$ echo $v
date

Tambahkan spasi dan tugas gagal:

$ v= date
Sun Mar  1 12:55:05 PST 2015

Di atas, shell untuk sementara vmengosongkan dan menjalankan dateperintah.

Tambahkan spasi sebelum =juga menyebabkan kegagalan tetapi karena alasan yang berbeda:

$ v =date
bash: v: command not found

Di sini, shell mencoba mengeksekusi perintah vdengan argumen =date. Kesalahannya adalah karena tidak ditemukan perintah bernama v.

John1024
sumber
1
Baru-baru ini saya menjadi korban pernyataan penugasan. Saya memiliki ruang sebelum dan sesudah =. Butuh waktu beberapa saat untuk debug.
topher
3

Pipa memungkinkan Anda menggunakan output dari program sebagai input dari yang lain ...

Sejauh ruang, itu hanya masalah keterbacaan / preferensi personil seperti @jasonwryan disebutkan.

Satu spasi-sebelum dan sesudah "|" adalah norma ....

Anda juga dapat menggunakannya dengan kolom -t, untuk tidak hanya membuat satu liner Anda rapi, tetapi juga output Anda.

lnydex99uhc:depot_r user$ lsof | grep my | column -t
Microsoft  290  user  txt  REG  1,4  9515016  170972    /Library/Fonts/PCmyoungjo.ttf
bash       359  user  cwd  DIR  1,4  714      12246074  /Users/zatef/hw2/base/active/myapp
zee
sumber
2

Ada satu kasus di mana berguna untuk tidak menggunakan spasi. Jika Anda tidak menggunakan tata letak AS-Amerika, Anda mungkin terpaksa menggunakan beberapa kombinasi seperti AltShiftLuntuk memasukkan pipa. Meskipun ini bukan masalah semata, satu konsekuensi adalah bahwa kadang-kadang Anda juga memasukkan karakter yang tidak dicetak sebelum atau setelah karakter itu. Sebagai contoh, pada keyboard Macbook Pro Perancis, saya harus menggunakan AltShiftLinput |. Ketika Anda mengetik dengan cepat, Anda dapat secara tidak sengaja mengetik ini: AltShift( L, Space)

$ sudo dmesg | tail
zsh: command not found:  tail

echo "sudo dmesg | tail" | od -a
0000000    s   u   d   o  sp   d   m   e   s   g  sp   |         t   a
0000020    i   l  nl

Jika Anda tidak mengetahui bahwa AltShiftSpacememasukkan spasi yang berbeda (ruang tanpa putus ( U + 00A0 )), kesalahan berikut mungkin sulit dipahami:zsh: command not found:  tail

alecail
sumber
1

Satu-satunya signifikansi ruang dalam hal ini adalah estetika.
Atau dengan kata lain berguna untuk membuat perintah lebih mudah dibaca oleh manusia.

pindahkan
sumber