Bash seçeneklerinde son “-” (kısa çizgi) ne anlama geliyor?


15

In Bu eğitimde aşağıdaki komutu çalıştırmanız gerekir:

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

-Sonrasındaki son (tire) ne anlama bashgeliyor?

Bununla ilgili çok fazla komut gördüm ve kendime mantıklı bir açıklama bulamadım ve ne de bir Google aramasını nasıl yeniden düzenleyeceğimi bulamadım. Borulu komutun çıktısı mı?



2
Ağdan bir şeyler indirmek ve doğrudan sudo bashseslere borulamak gerçekten korkutucu. Bu tür uygulamaları teşvik etmeyen bir eğitim aramayı deneyin.
hmakholm Monica

Onun npm öğretici, ama seninle aynı fikirdeyim ...
Omar BISTAMI

1
İçinde sembol bulunan şeyleri aramanız gerekiyorsa, deneyin symbolhound.com.
Joe

Yanıtlar:


31

Bash söz konusu olduğunda standart olmayan bir şekilde davranır -.

POSIX diyor ki:

Yönerge 10: Seçenek bağımsız değişkeni olmayan
ilk --bağımsız değişken, seçeneklerin sonunu belirten bir sınırlayıcı olarak kabul edilmelidir. Aşağıdaki argümanlar -karakterle başlasalar bile işlenen olarak ele alınmalıdır .

[...]

Yönerge 13:
Okuma veya yazma amacıyla açılacak dosyaları temsil etmek için işlenen kullanan yardımcı programlar için, -işlenen yalnızca standart girdi (veya bir çıktı dosyasının belirtildiği bağlamdan net olduğunda standart çıktı) veya adlı dosya -.

Ve

POSIX.1-2017'nin Shell ve Utilities hacminde bu yönergelere uygun olarak tanımlanan bir yardımcı programın, işlenenin -standart girdi veya çıktı anlamına gelmesini kabul etmesi ya da kabul etmemesi gerektiğinde , bu kullanım OPERANDS bölümünde açıklanmaktadır. Aksi takdirde, böyle bir yardımcı program dosyaları temsil etmek için işlenenler kullanıyorsa, işlenenin -standart girdi (veya standart çıktı) mı yoksa adlı bir dosya mı olduğu uygulama tarafından tanımlanır -.

Ama sonra man 1 bashokur:

A --seçeneklerin sonunu bildirir ve daha fazla seçenek işlemeyi devre dışı bırakır. Tarihinden sonraki tüm argümanlar --dosya adı ve argüman olarak değerlendirilir. Argümanı -ile eşdeğerdir --.

Dolayısıyla Bash için -ne standart girdi ne de dosya anlamına gelir, dolayısıyla bir şekilde standart değildir.

Şimdi özel durumunuz:

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

Ben şüpheli farkında olmayabilir bu komut yazarı -eşdeğerdir --bu durumda. Ben şüpheli yazar emin olmak istedim bashstandart giriş okuyacaktır, beklediklerinden -kılavuz 13 uyarınca işe.

Ancak, talimatlara göre çalışsa bile, -burada gereksiz olacaktır , çünkü bashstandart girişinin ne zaman bir boru olduğunu algılar ve buna göre hareket eder (verilmediği sürece -c).

Yine -de kılavuz ilkelere göre çalışmaz, gibi çalışır --. Yine --kendinden sonra başka argümanlar vardır çünkü burada gereksizdir.

Bence son -hiçbir şey değişmez. Komut onsuz çalışır.

Genel olarak nasıl --ve -yararlı olabileceğini görmek için aşağıdaki örneği inceleyin.


catBenim Kubuntu'da hem yönergelere uyar ve ben faydasını göstermek için kullanacak -ve --.

Adlı bir dosya olsun foo. Bu dosyayı yazdırır:

cat foo

Adlı bir dosya olsun --help. Bu dosyayı yazdırmaz:

cat --help

Ancak bu, şu dosyayı yazdırır --help:

cat -- --help

Bu, adlandırılan dosyayı --helpstandart girdiden gelenlerle birleştirir :

cat -- --help -

Gerçekten ihtiyacınız yok gibi görünüyor --, çünkü her zaman ./--helpbir dosya olarak yorumlanacak olanı geçebilirsiniz . Ama düşün

cat "$file"

değişkenin içeriğinin ne olduğunu önceden bilmediğinizde. Sadece başına geçemezsiniz ./, çünkü bu mutlak bir yol olabilir ve ./onu kıracaktır. Öte yandan adlı bir dosya olabilir--help (çünkü neden olmasın?). Bu durumda --çok faydalıdır; bu çok daha sağlam bir komut:

cat -- "$file"

6

In man bash, tek karakterlik seçenekler sonunda vardır: -

--    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 --.

Komutun tamamını verdiyseniz, bu durumda daha -sonra kullanmak için bir neden göremiyorum bash, ancak zarar vermez.


Cevabınız için teşekkür ederim, Evet komutun tamamını alıntıladım. bu nedenle - veya - sonrası herhangi bir seçenek bir seçenek olarak değil, bir dosya adı veya bağımsız değişken olarak görülmez, lütfen bunun yararlı olduğu bir örnek verebilir misiniz?
Omar BISTAMI

1
Gerçekten, adı başlayan bir komut dosyasına izin vermek -, beklenmedik bir gerekliliktir, ancak -/ --bunu mümkün kılar.
AFH

1
@OmarBISTAMI Bir komutun alıntılanması kabuğun onu genişletme şeklini etkiler, ancak onu izleyen bağımsız değişkenleri etkilemez. Alıntıları meşru bağımsız değişkenler etrafında genişletirseniz, komut adının bir parçası haline gelir ve bu da istediğiniz şey değildir. Dosya adlarını bağımsız değişken olarak alan ancak varsayılan olarak standart girdi kullanmayan bazı komutlar vardır. Bir örnek, girişi iki dosya arasında (bir terminalden veya bir borudan) sandviç yapmanızı sağlar. cat file1 - file2 > file3.
Joe

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

bash -bu bashstdin'i bekliyor demektir . Bu yüzden pratikte bash, soldaki komut tarafından döndürülenleri çalıştırır.|

Benzer ama daha kolay bir örnek:

echo hello | cat - burada, cat'merhaba' yazdıracak. Neden? 'Merhaba' aracılığıyla kediye gönderiliyor Çünkü |ve catbuna şey gönderilenle bekliyor

Şimdi tüm komutu ikiye ayıralım:

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

bu curl komutu bash tarafından anlaşılabilecek ve yürütülebilecek bir şey döndürecektir

sonra |kıvırma komutuyla döndürülen çıktıyı borunun sağ tarafına gönderecek bir borumuz var yani sudo -E bash -. Sonunda sudo -E bash -, bash gönderilen her şeyi yürütmeye hazır

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.