Пространства в командах с перенаправлением

Ответ на вопрос OP.

Это не было связано с рубином. Я открыл файл msfconsole и был недопустимый путь «require».
4
задан 5 December 2017 в 13:56

3 ответа

Да, расстояние между словами и перенаправление не имеет значения. Это короткий ответ.

Подробности заключаются в том, что оболочка (для простоты давайте просто ссылаться только на bash) обрабатывает определенные символы и группы символов как «слова» и «метасимволы». Из руководства bash 4.3:

metacharacter Символ, который при некорректном выражении отделяет слова. Одно из следующего:
|  & ; ( ) < > space tab

И

metacharacter

word Последовательность символов, рассматриваемых как единое целое с помощью оболочка.

$ echo "hello world">/dev/null

Итак, когда мы делаем:

$ echo "hello world" > /dev/null

или

, это все еще 3 слова («привет мир» может быть считается одним словом оболочки, потому что оно цитируется), с одним метасимволом > и парами. Shell увидит его и сначала выполнит перенаправление (поэтому сначала он ищет метасимволы), а затем запускает команды в соответствии со своим стандартным поведением.

$ stat ./non-existent file 2>&1  > /dev/null
stat: cannot stat './non-existent': No such file or directory
stat: cannot stat 'file': No such file or directory

Однако порядок перенаправления имеет большое значение, особенно когда вы дублируете файловые дескрипторы с чем-то вроде 2>&1. Предположим, вы хотите отправить как stderr, так и stdin в одно и то же место. Это неправильный способ:

Вы делаете вывод файла 2 в том же месте, что и 1, который является вашим терминалом, но он уже это делал. Вот почему появляется stderr.

$ stat ./non-existent file > /dev/null 2>&1 
5
ответ дан 22 May 2018 в 15:38
  • 1
    Спасибо за подробный и практичный ответ. Я чувствую, что никогда не буду разбираться в перенаправлении. Когда я смогу достичь своего уровня, Занна ?? – Smile 5 December 2017 в 15:28
  • 2
    Будет " echo foo2 & gt; bar " интерпретироваться как "echo foo 2 & gt; bar" или "echo foo2 & gt; bar" – Peter Green 5 December 2017 в 18:51
  • 3
    @Smile Я только сделал крошечное редактирование грамматики этого вопроса. Сергей - автор и знающий! – Zanna 5 December 2017 в 19:08
  • 4
    @PeterGreen Будет echo foo2 > bar. – wjandrea 5 December 2017 в 20:54
  • 5
    @PeterGreen хороший вопрос! Он будет интерпретироваться как echo foo2 >bar, потому что если мы разделим команду на отдельные токены, используя пробел, а > в качестве метасимволов, это будет 3 слова: echo, foo2 и bar. Только когда номер filedescriptor появляется сам по строке, тогда он рассматривается как отдельный элемент, иначе он является частью другого слова. – Sergiy Kolodyazhnyy 5 December 2017 в 21:42

Да, расстояние между словами и перенаправление не имеет значения. Это короткий ответ.

Подробности заключаются в том, что оболочка (для простоты давайте просто ссылаться только на bash) обрабатывает определенные символы и группы символов как «слова» и «метасимволы». Из руководства bash 4.3:

metacharacter Символ, который при некорректном выражении отделяет слова. Одно из следующего: | & ; ( ) < > space tab

И

metacharacter

word Последовательность символов, рассматриваемых как единое целое с помощью оболочка.

$ echo "hello world">/dev/null

Итак, когда мы делаем:

$ echo "hello world" > /dev/null

или

, это все еще 3 слова («привет мир» может быть считается одним словом оболочки, потому что оно цитируется), с одним метасимволом > и парами. Shell увидит его и сначала выполнит перенаправление (поэтому сначала он ищет метасимволы), а затем запускает команды в соответствии со своим стандартным поведением.

$ stat ./non-existent file 2>&1 > /dev/null stat: cannot stat './non-existent': No such file or directory stat: cannot stat 'file': No such file or directory

Однако порядок перенаправления имеет большое значение, особенно когда вы дублируете файловые дескрипторы с чем-то вроде 2>&1. Предположим, вы хотите отправить как stderr, так и stdin в одно и то же место. Это неправильный способ:

Вы делаете вывод файла 2 в том же месте, что и 1, который является вашим терминалом, но он уже это делал. Вот почему появляется stderr.

$ stat ./non-existent file > /dev/null 2>&1
5
ответ дан 18 July 2018 в 01:49

Да, расстояние между словами и перенаправление не имеет значения. Это короткий ответ.

Подробности заключаются в том, что оболочка (для простоты давайте просто ссылаться только на bash) обрабатывает определенные символы и группы символов как «слова» и «метасимволы». Из руководства bash 4.3:

metacharacter Символ, который при некорректном выражении отделяет слова. Одно из следующего: | & ; ( ) < > space tab

И

metacharacter

word Последовательность символов, рассматриваемых как единое целое с помощью оболочка.

$ echo "hello world">/dev/null

Итак, когда мы делаем:

$ echo "hello world" > /dev/null

или

, это все еще 3 слова («привет мир» может быть считается одним словом оболочки, потому что оно цитируется), с одним метасимволом > и парами. Shell увидит его и сначала выполнит перенаправление (поэтому сначала он ищет метасимволы), а затем запускает команды в соответствии со своим стандартным поведением.

$ stat ./non-existent file 2>&1 > /dev/null stat: cannot stat './non-existent': No such file or directory stat: cannot stat 'file': No such file or directory

Однако порядок перенаправления имеет большое значение, особенно когда вы дублируете файловые дескрипторы с чем-то вроде 2>&1. Предположим, вы хотите отправить как stderr, так и stdin в одно и то же место. Это неправильный способ:

Вы делаете вывод файла 2 в том же месте, что и 1, который является вашим терминалом, но он уже это делал. Вот почему появляется stderr.

$ stat ./non-existent file > /dev/null 2>&1
5
ответ дан 24 July 2018 в 17:27

Другие вопросы по тегам:

Похожие вопросы: