Apa yang dimaksud dengan `[EXPRESSION], [] dan [OPTION` dalam` man test`?

8

Meneliti man test, saya melihat bahwa di bawah sinopsis untuk testkemungkinan test EXPRESSIONdan test.

Apa yang dimaksud di [ EXPRESSION ], [ ] and [OPTIONbawah ini?

Mengapa tanda kurung kosong dan mengapa tidak [OPTIONada tanda kurung? Bisakah seseorang menafsirkan ini untuk saya?

NAME
       test - check file types and compare values

SYNOPSIS
       test EXPRESSION
       test

       [ EXPRESSION ]
       [ ]
       [ OPTION
Shuzheng
sumber

Jawaban:

10

[adalah nama lain untuk test. Ketiga baris tersebut adalah baris perintah yang dijalankan testdengan beberapa opsi.

Di baris pertama, ini adalah pengujian standar: [ 5 -gt 4 ]sama dengan test 5 -gt 4.

Dalam yang kedua, ekspresi dihilangkan, yang berarti keluar false ( 0 arguments: Exit false (1)).

Untuk kasus ketiga Anda, saya kira, menggunakan GNU coreutils. Di GNU testteks bantuan berisi catatan ini:

NOTE: [ honors the --help and --version options, but test does not.
test treats each of those as it treats any other nonempty STRING.

Ini adalah ekstensi non-POSIX ; motivasi tampaknya testdiperlukan untuk memperlakukan argumen itu sebagai string seperti yang lain. [mampu membedakan kasing opsi dari kasing dengan kehadiran ]braket penutup .

Perhatikan bahwa shell Anda kemungkinan akan menyediakannya sendiri [, jadi Anda harus /bin/\[menggunakan versi ini.

Michael Homer
sumber
4

[sama seperti testshell yang dibangun di atas beberapa shell.

Jika Anda melihat lebih jauh ke bawah man test, itu menjelaskan apa yang valid EXPRESSIONyang dapat Anda uji dengan:

EKSPRESI yang dihilangkan default ke false. Kalau tidak, EKSPRESI benar atau salah dan menetapkan status keluar. Ini adalah salah satu dari: ...

Ini mungkin tidak jelas bagi Anda dari orang-halaman, tetapi dalam lebih tua / beberapa shell lain, baik [dan testtersedia sebagai perintah yang sebenarnya, yang berarti ruang yang Anda lihat di [ EXPRESSION ]adalah wajib untuk EXPRESSIONditerima sebagai argumen untuk [/ test. Jadi, bahkan untuk cangkang yang menawarkannya sebagai builtin, mereka mempertahankan format ini untuk kompatibilitas.

Dan seperti yang dijelaskan dalam jawaban @ dr01 saat saya mengetik ini, tanda kurung siku kanan adalah opsional.

hjk
sumber
@don_crissti terima kasih atas semua ini, saya pikir saya hanya akan menghilangkan kalimat terakhir itu ...
hjk
0

[ OPTION tidak benar-benar kehilangan braket.

Bahkan, mungkin secara mengejutkan, [adalah perintah (terletak di /usr/bin/[) setara dengan test. Oleh karena itu (setidaknya secara teoritis) diizinkan untuk menggunakan hanya braket kiri, dengan braket kanan berfungsi seperti gula sintaksis. Namun, versi shell yang lebih baru membutuhkannya .

dr_
sumber
Apakah ada perbedaan lain antara ini daripada testtidak dapat digunakan dengan opsi (tidak terdaftar dengan kemungkinan itu).
Shuzheng
1
Hal ini tidak diizinkan untuk menghilangkan braket yang tepat, baik dalam POSIX atau GNU [.
Michael Homer
@MichaelHomer Ya. Dikoreksi.
dr_
Saya tidak yakin apa yang harus dilakukan Bash dengan ini ...
Michael Homer
1
@MichaelHomer, dalam POSIX, perilaku jika Anda menghilangkan braket yang tepat tidak ditentukan, sehingga skrip POSIX tidak diizinkan untuk menghilangkan ], tetapi POSIX [dapat melakukan apa yang diinginkannya termasuk memanggil Anda nama dan me-reboot mesin atau mencetak pesan bantuan jika Anda menyebutnya tanpa itu. Yang memungkinkan GNU grep's [ --version. test --versiondan [ --version ]namun diminta untuk kembali benar (tes untuk --versionmenjadi string yang tidak kosong) dan output apa-apa.
Stéphane Chazelas