"बैश -" का मतलब क्या है?


33

bash -निम्नलिखित बैश शेल कोड में क्या अर्थ है? यह आउटपुट को अंतिम कोड इनपुट के रूप में लेने के लिए उपयोग किया जाता है। यदि हां, तो क्या मैं इसे बस के रूप में लिख सकता हूं bashया xargs bash?

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

जवाबों:


36

जब संदेह हो, तो स्रोत कोड पढ़ें। =)

shell.cसमारोह में बैश 4.3, पंक्ति 830parse_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);

दूसरे शब्दों में, -यह कह रहा है कि अधिक विकल्प नहीं हैं । यदि कमांड लाइन पर कोई और शब्द थे, तो उन्हें एक फ़ाइल नाम के रूप में माना जाएगा, भले ही शब्द ए के साथ शुरू हुआ हो -

आपके उदाहरण में, निश्चित रूप से, -यह पूरी तरह से बेमानी है, क्योंकि इसके बाद कुछ भी नहीं है। दूसरे शब्दों में, bash -इसके बिल्कुल बराबर हैbash


बैश इसकी आज्ञा लेता है

  1. स्क्रिप्ट फ़ाइल से यदि यह कमांड लाइन पर प्रदान किया गया है, या
  2. गैर-अंतःक्रियात्मक रूप से यदि इसकी गति एक TTY नहीं है (जैसे कि आपके उदाहरण में: stdin एक पाइप है, तो Bash स्क्रिप्ट के रूप में उस URL की सामग्री को निष्पादित करेगा), या
  3. अंतःक्रियात्मक रूप से यदि इसकी स्टड एक TTY है।

यह एक गलत धारणा है जो bash -बैश को अपने मानक इनपुट से अपने आदेशों को पढ़ने के लिए कहती है। हालांकि यह है सच है कि अपने उदाहरण में, बैश stdin से अपने आदेशों पढ़ा जाएगा, इसके बारे में है कि क्या वहाँ एक था, इसलिए परवाह किए बिना किया होता -कमांड लाइन पर, क्योंकि, जैसा कि ऊपर कहा गया है, bash -के समान है bash

यह स्पष्ट करने के लिए कि -स्टड का मतलब नहीं है, विचार करें:

  • catआदेश एक व्याख्या करने के लिए डिज़ाइन किया गया है -stdin के रूप में। उदाहरण के लिए:

    $ 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
  • इसके विपरीत, आप बैश निष्पादित करने के लिए नहीं मिल सकता है /bin/dateतो /bin/hostnameयह कोशिश कर रहा द्वारा:

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

    बल्कि, यह /bin/hostnameएक शेल स्क्रिप्ट फ़ाइल के रूप में व्याख्या करने की कोशिश करता है , जो विफल हो जाता है क्योंकि यह द्विआधारी gobbledygook का एक गुच्छा है।

  • आप या तो date +%sउपयोग नहीं कर सकते 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

क्या आप xargs bashइसके बजाय लिख सकते हैं ? नहीं, curl | xargs bashकमांड-लाइन तर्कों के रूप में स्क्रिप्ट की सामग्री के साथ बैश का आह्वान करेगा। सामग्री का पहला शब्द पहला तर्क होगा, और इसे संभवतः स्क्रिप्ट नाम के रूप में गलत समझा जाएगा।


6
केवल सही उत्तर के लिए upvote।
जिरह

वास्तव में: मैनपेज के शब्दों मेंAn argument of - is equivalent to --.
स्टीलड्राइवर

यदि आप वास्तव में, वास्तव में xargsइसके बजाय उपयोग करना चाहते थे , तो यह (छोटे पर्याप्त इनपुट स्क्रिप्ट के सीमित परिदृश्य में) काम करेगा | xargs bash -c; लेकिन वास्तव में, यह एक उपयोगी या मुहावरेदार उपयोग नहीं है xargs
ट्रिपल

@tripleee यदि URL की सामग्री एक-लाइनर से अधिक कुछ भी है, तो लाइन टूट जाती है और अन्य सीमांकक शायद सभी गलत होंगे।
200_success

दुआ, आप सही कह रहे हैं, बिल्कुल।
त्रिवेणी ३०'१५
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.