“Bash” daki “-” ne anlama geliyor?


33

bash -Aşağıdaki bash kabuk kodunda ne anlama geliyor? Çıkışa son kodun girdi olarak alınması için kullanılıyor gibi görünüyor. Eğer öyleyse, ben sadece olarak yazabilir bashveya xargs bash?

curl --silent --location https://rpm.nodesource.com/setup | bash -

Yanıtlar:


36

Şüphe durumunda, kaynak kodunu okuyun. =)

Bash 4.3, shell.csatır 830, fonksiyondaparse_shell_options() :

  /* A single `-' signals the end of options.  From the 4.3 BSD sh.
     An option `--' means the same thing; this is the standard
     getopt(3) meaning. */
  if (arg_string[0] == '-' &&
       (arg_string[1] == '\0' ||
         (arg_string[1] == '-' && arg_string[2] == '\0')))
    return (next_arg);

Başka bir deyişle, başka seçenek olmadığını- söylüyor . Komut satırında başka kelimeler olsa, kelimesi a ile başlasa bile, dosya adı olarak kabul edilirdi .-

Örneğinizde, elbette, bu -tamamen gereksizdir, çünkü onu takip eden hiçbir şey yoktur. Başka bir deyişle, bash -tam olarak eşdeğerdirbash .


Bash komutlarını alır

  1. komut satırında sağlanmışsa bir komut dosyasından veya
  2. stdin'i bir TTY değilse (örnekte olduğu gibi: stdin bir pipo olduğundan, Bash bu URL'nin içeriğini bir komut dosyası olarak yürütecektir),
  3. etkileşimli olarak stdin bir TTY ise.

bash -Bash'e komutlarını standart girişten okumasını söyleyen bir yanılgıdır . Örnekte, Bash'in komutlarını stdin'den okuyacağı doğru olsa da ,- komut satırında bir satır olup olmamasına bakılmaksızın bunu yapardı , çünkü yukarıda belirtildiği gibi bash -aynıydı bash.

Bunun -stdin anlamına gelmediğini göstermek için , şunları göz önünde bulundurun:

  • catKomutu bir yorumlamak için tasarlanmıştır -stdin'i olarak. Örneğin:

    $ echo xxx | cat /etc/hosts - /etc/shells
    127.0.0.1 localhost
    xxx
    # /etc/shells: valid login shells
    /bin/sh
    /bin/dash
    /bin/bash
    /bin/rbash
    /bin/zsh
    /usr/bin/zsh
    /usr/bin/screen
    /bin/tcsh
    /usr/bin/tcsh
    /usr/bin/tmux
    /bin/ksh93
  • Bunun tersine, Bash yürütmek alamayan /bin/datesonra /bin/hostnamebu deneyerek:

    $ echo date | bash - hostname
    /bin/hostname: /bin/hostname: cannot execute binary file

    Aksine, /bin/hostnamebir demet ikili gobbledygook olduğu için başarısız olan bir kabuk betiği dosyası olarak yorumlamaya çalışır .

  • İkisini de date +%skullanarak yürütemezsiniz bash -.

    $ date +%s
    1448696965
    $ echo date | bash -
    Sat Nov 28 07:49:31 UTC 2015
    $ echo date | bash - +%s
    bash: +%s: No such file or directory

Onun xargs bashyerine yazabilir misin ? No. curl | xargs bash, bash'ı komut dosyasının içeriğiyle komut satırı argümanları olarak çağırır. İçeriğin ilk sözcüğü ilk argüman olur ve muhtemelen bir komut dosyası dosya adı olarak yanlış anlaşılır.


6
sadece doğru cevap için oy.
geirha

Nitekim: manpage sözleriyleAn argument of - is equivalent to --.
steeldriver

Eğer gerçekten, gerçekten kullanmak xargsistiyosanız, (yeterince küçük bir giriş betiğinin sınırlı senaryosunda) ile çalışırdı | xargs bash -c; ama gerçekten, bu yararlı ya da deyimsel bir kullanım değildir xargs.
üçlü

@ tripleee Eğer URL'nin içeriği bir liner'den başka bir şeyse, satır sonları ve diğer sınırlayıcılar muhtemelen yanlış olur.
200:

Duh, haklısın elbette.
üçlü
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.