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?


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.


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

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


1

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.