जवाबों:
जब संदेह हो, तो स्रोत कोड पढ़ें। =)
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 ।
बैश इसकी आज्ञा लेता है
यह एक गलत धारणा है जो 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कमांड-लाइन तर्कों के रूप में स्क्रिप्ट की सामग्री के साथ बैश का आह्वान करेगा। सामग्री का पहला शब्द पहला तर्क होगा, और इसे संभवतः स्क्रिप्ट नाम के रूप में गलत समझा जाएगा।
An argument of - is equivalent to --.
xargsइसके बजाय उपयोग करना चाहते थे , तो यह (छोटे पर्याप्त इनपुट स्क्रिप्ट के सीमित परिदृश्य में) काम करेगा | xargs bash -c; लेकिन वास्तव में, यह एक उपयोगी या मुहावरेदार उपयोग नहीं है xargs।