LINUX.ORG.RU

Почему команда «bash -c cd /tmp notDir» не выдает ошибку?

 


0

1

Если попробовать выполнить команду:

bash -c cd /tmp notDir

То она молча выполнится и никакой ошибки не будет выдано.

Что в этом случае происходит с параметром notDir, который представляет из себя бессмысленный для системы набор символов? Почему на него команда не ругается?

★★★★★

Ага, походу понял.

notDir в данном случае передается в команду bash в виде значения переменной $1. И просто нигде не используется. Вона как.

Xintrea ★★★★★
() автор топика
Последнее исправление: Xintrea (всего исправлений: 1)
Ответ на: комментарий от beastie

notDir - не аргумент cd cd как раз от второго аргумента выйдет с 1

bash -c 'cd / hyi'
bash: line 0: cd: too many arguments
K-Vrat
()

Что в этом случае происходит с параметром notDir, который представляет из себя бессмысленный для системы набор символов? Почему на него команда не ругается?

То же, что и с параметром /tmp. Поскольку Вы не обернули Вашу команду в кавычки, она состоит из cd, без аргументов.

AITap ★★★★★
()
Ответ на: комментарий от beastie

Без пол-литры тут не разберёшься

Да ладно. Третий же абзац man bash:

-c If the -c option is present, then commands are read from the first non-option argument command_string. If there are arguments after the command_string, the first argument is assigned to $0 and any remaining arguments are as-signed to the positional parameters.

Какое слово перевести?

Причём, TC генерирует топики, ответы не читает, а в предыдущем дали почти правильный ответ и я дал рабочий скрипт с поправкой коментатора. Почему составная команда с ошибкой не генерирует ошибку?

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от vodz

-c If the -c option is present, then commands are read from the first non-option argument command_string. If there are arguments after the command_string, the first argument is assigned to $0 and any remaining arguments are as-signed to the positional parameters.

Какое слово перевести?

Желательно все. Пока что лучшее, что я смог из этого выжать:

bash [options] [command_string | file]

Если присутствует параметр -c, то команды считываются из первого аргумента, не являющегося параметром командной строки (command_string). Если после командной строки (command_string) есть аргументы, первый аргумент присваивается $0, а все остальные аргументы присваиваются позиционным параметрам.

Как по мне, так это полная белиберда. Возьмем команду:

bash -c cd /tmp notDir

Здесь command_string - это cd, согласно документации. И согласно документации, написано, что «команды считываются из первого аргумента, не являющегося параметром командной строки (command_string)». Значит, командой должно считаться /tmp. Но это же дичь.

Далее написано: «Если после командной строки (command_string) есть аргументы, первый аргумент присваивается $0». Так как у нас command_string - это cd, то $0 - это /tmp. Вообще отлично, ведь у нас в $0 имя исполняемого файла или встроенной команды по-хорошему должно быть, а тут получается что /tmp.

Как-то нужно переформулировать, чтобы понять что имеется в виду.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Вообще отлично, ведь у нас в $0 имя исполняемого файла или встроенной команды по-хорошему должно быть, а тут получается что /tmp.

Отдельное присваивание $0 здесь логично по причине, что вы передаете строку с командами, то есть целый скрипт и хорошо, что ему можно выдать отдельное имя и дополнительные аргументы к этому скрипту. По сути это аналог вызова bash script_file arg1 arg2, но сам скрипт и его имя при вызове с -c передаете непосредственно в командной строке.

vodz ★★★★★
()
Ответ на: комментарий от vodz

Не очень понятно вы написали.

Тут, видимо, происходит следующее:

bash [options] [command_string | file]

bash -c cd /tmp notDir
Здесь -c - это опция, а «cd /tmp notDir» - это параметр опции. command_string тут вообще нет.

Далее, как вы говорите, bash внутри себя преобразует это дело в:
bash [options] [command_string | file]

bash cd /tmp notDir
Здесь опций нет, а command_string - это cd. А все что после cd - это аргументы.

Но почему первый после cd аргумент помещается в $0 (согласно описанию) - непонятно. Ведь он должен помещаться в $1. А в $0 должно храниться, по хорошему, имя бинарника/команды, то есть cd.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea
bash -c cd /tmp notDir

Здесь -c - это опция, а «cd /tmp notDir» - это параметр опции.

Поскольку Вы не обернули cd /tmp notDir в кавычки, оно развернулось в много параметров для bash. В результате параметром опции -c остаётся только cd.

AITap ★★★★★
()
Ответ на: комментарий от AITap

Поскольку Вы не обернули cd /tmp notDir в кавычки, оно развернулось в много параметров для bash. В результате параметром опции -c остаётся только cd.

Да, поэтому /tmp notDir - являются опциями. $0 - это /tmp, $1 - это notDir.

Об этом я написал в первом же комментарии.

Но меня стали упорно поправлять и вообще взорвали мозго.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Здесь -c - это опция, а «cd /tmp notDir» - это параметр опции. command_string тут вообще нет.

Ну не тормозите. Опция "-c", аргумент у этой опции «cd», которая и называется command_string когда опция есть "-c". Но так как после -c command_string добавлена еще и дополнительная опция script_name для именования скрипта в command_string, то у вашего скрипта $0 будет /tmp $1=notDir

vodz ★★★★★
()
Ответ на: комментарий от vodz

«cd» ’- это не аргумент опции, (в отличии от compat32). Это первый неопциональный аргумент всего вызова bash, поэтому он и через | приведен с названием файла, -c переключает весь вызов в режим «запускай одну команду - первый аргумент»

bash --pretty-print -c -v +O compat32 -O compat43  'echo $0 $1 $2' Xintrea ne tupoy
aedeph_ ★★
()
Ответ на: комментарий от aedeph_

это не аргумент опции, (в отличии от compat32). Это первый неопциональный аргумент всего вызова bash

Для понимания, что происходит, проще рассматривать именно так, я объяснял конкретный пример, ибо «запускай одну команду» — тоже не правда ваша, в строке можно написать целый скрипт, но спишем на разбор конкретного примера.

vodz ★★★★★
()
Ответ на: комментарий от vodz

проще рассматривать именно так

Это «не проще», это «не верно». Зачем для простоты рассматривать ошибочные представления?

Одна комманда - одна строка, которая может состоять из произвольного текста на языке bash, какие проблемы?

aedeph_ ★★
()
Ответ на: комментарий от aedeph_

Это «не проще», это «не верно».

Это не верно в общем случае, уже сказано, что все в курсе и речь была о объяснениях на пальцах. Но... А нафиг, какой тупой спор, когда всё уже сказано.

Одна комманда - одна строка

Видите ли, дело даже не в взаимных мелочных придирках, а в том, что и ТС-у надо и вообще в принципе bash -c «cd DIR» без добавления ещё команд совершенно бессмысленно, как и выше протицированное.

vodz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.