Apa arti “-” (tanda hubung) terakhir dalam opsi `bash`?


15

Dalam tutorial ini kita perlu menjalankan perintah berikut:

# curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -

Apa yang dimaksud dengan -tanda hubung terakhir bash?

Saya telah melihat banyak perintah dengan ini, dan tidak dapat menemukan diri saya penjelasan logis dan juga tidak menemukan cara merumuskan kembali pencarian google untuk itu. Apakah ini merupakan output dari perintah piped?



2
Mengunduh hal-hal dari jaringan dan menyalurkannya langsung ke sudo bashsuara benar-benar menakutkan. Coba cari tutorial yang tidak mendorong praktik seperti itu.
hmakholm tersisa Monica

Ini tutorial npm, tapi saya setuju dengan Anda ...
Omar BISTAMI

1
Jika Anda perlu mencari benda dengan simbol di dalamnya, cobalah symbolhound.com.
Joe

Jawaban:


31

Bash berperilaku agak non-standar ketika datang ke -.

POSIX mengatakan:

Pedoman 10: Argumen
pertama --yang bukan opsi-argumen harus diterima sebagai pembatas yang menunjukkan akhir opsi. Argumen berikut harus diperlakukan sebagai operan, bahkan jika mereka mulai dengan- karakter.

[...]

Panduan 13:
Untuk utilitas yang menggunakan operan untuk mewakili file yang akan dibuka baik untuk membaca atau menulis, -operan harus digunakan untuk berarti hanya input standar (atau output standar ketika jelas dari konteksnya bahwa file output sedang ditentukan) atau nama file -.

Dan

Jika utilitas yang dijelaskan dalam volume Shell dan Utilitas dari POSIX.1-2017 sesuai dengan pedoman ini diperlukan untuk menerima, atau tidak menerima, operan -berarti input atau output standar, penggunaan ini dijelaskan di bagian OPERANDS. Kalau tidak, jika utilitas tersebut menggunakan operan untuk mewakili file, itu adalah implementasi yang ditentukan apakah operan -singkatan dari input standar (atau output standar), atau untuk file bernama -.

Tapi kemudian man 1 bashterbaca:

A --menandai akhir opsi dan menonaktifkan pemrosesan opsi lebih lanjut. Setiap argumen setelah --diperlakukan sebagai nama file dan argumen. Argumen -setara dengan --.

Jadi untuk Bash -berarti bukan input standar atau file, maka agak non-standar.

Sekarang kasus khusus Anda:

curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -

Saya menduga penulis perintah ini mungkin tidak menyadari -setara dengan --dalam hal ini. Saya curiga penulis ingin memastikan bashakan membaca dari input standarnya, mereka diharapkan -bekerja sesuai dengan pedoman 13.

Tetapi bahkan jika itu bekerja sesuai dengan pedoman, -akan tidak perlu di sini karena bashmendeteksi ketika input standarnya adalah pipa dan bertindak sesuai (kecuali -cdiberikan dll.).

Namun -tidak bekerja sesuai dengan pedoman, itu berfungsi seperti --. Masih --tidak perlu di sini karena tidak ada argumen setelahnya.

Menurut pendapat saya yang terakhir -tidak mengubah apa pun. Perintah itu akan bekerja tanpanya.

Untuk melihat bagaimana --dan -dapat bermanfaat secara umum, pelajari contoh di bawah ini.


catdi Kubuntu saya mematuhi kedua pedoman dan saya akan menggunakannya untuk menunjukkan kegunaan -dan-- .

Biarkan file bernama fooada. Ini akan mencetak file:

cat foo

Biarkan file bernama --helpada. Ini tidak akan mencetak file:

cat --help

Tetapi ini akan mencetak file bernama --help:

cat -- --help

Ini akan menyatukan file bernama --helpdengan apa pun yang berasal dari input standar:

cat -- --help -

Tampaknya Anda tidak benar-benar membutuhkannya --, karena Anda selalu dapat lulus ./--helpyang akan ditafsirkan sebagai file pasti. Tapi pertimbangkan

cat "$file"

ketika Anda tidak tahu sebelumnya apa isi variabel itu. Anda tidak bisa hanya bergantung ./padanya, karena itu mungkin jalan yang absolut dan ./akan merusaknya. Di sisi lain itu mungkin file bernama --help(karena mengapa tidak?). Dalam hal --ini sangat berguna; ini adalah perintah yang jauh lebih kuat:

cat -- "$file"

6

Di man bash, pada akhir opsi karakter tunggal ada: -

--    A -- signals the end of options and disables further option processing.
      Any arguments after the -- are treated as filenames and arguments. An
      argument of - is equivalent to --.

Jika Anda telah mengutip perintah lengkap, saya tidak dapat melihat alasan untuk menggunakan -setelah bashdalam contoh ini, tetapi tidak ada salahnya.


Terima kasih atas jawaban Anda, Ya saya telah mengutip perintah lengkap. jadi apa pun setelah - atau - tidak akan dilihat sebagai opsi tetapi sebagai nama file atau argumen, dapatkah Anda memberi contoh di mana itu berguna?
Omar BISTAMI

1
Ini benar-benar untuk memungkinkan script yang namanya dimulai -, persyaratan tidak mungkin, tapi -/ --memungkinkan.
AFH

1
@OmarBISTAMI Mengutip sebuah perintah akan memengaruhi bagaimana shell memperluasnya, tetapi tidak akan memengaruhi argumen apa pun yang mengikutinya. Jika Anda memperpanjang tanda kutip di sekitar argumen yang sah, maka itu menjadi bagian dari nama perintah yang juga bukan yang Anda inginkan. Ada beberapa perintah yang menggunakan nama file sebagai argumen, tetapi tidak menggunakan input standar secara default. Contoh yang dibuat memungkinkan Anda untuk memasukkan sandwich (dari terminal atau pipa) antara dua file. cat file1 - file2 > file3.
Joe

1
curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -

bash - maksudnya bash sedang menunggu stdin. Jadi praktis bash akan mengeksekusi apa pun yang dikembalikan oleh perintah yang ada di sebelah kiri|

Contoh serupa namun lebih mudah adalah:

echo hello | cat - di sini, catakan dicetak 'halo'. Mengapa? Karena 'halo' sedang dikirim ke kucing melalui |dan catsedang menunggu apa pun yang dikirim ke sana

Sekarang mari kita pecahkan seluruh perintah menjadi dua:

curl -sL https://rpm.nodesource.com/setup_6.x

perintah curl ini akan mengembalikan sesuatu yang bisa dimengerti dan dieksekusi oleh bash

maka kita memiliki pipa |yang akan mengirim output yang dikembalikan oleh perintah curl ke sisi kanan pipa yaitu sudo -E bash -. Akhirnya sudo -E bash -, bash siap untuk mengeksekusi apa pun yang dikirim kepadanya

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.