Когда я выпускаю:

bash -l -c "./test"

subshell действительно запускается как оболочка входа в систему, но в случае:

bash -c "./test1" -l

родительская оболочка (оболочка, в которой я запускаю команду), похоже, игнорирует параметр -l а подоболочка не запускается как оболочка входа в систему.

Если я прав, причина в том, что порядок опций команды bash имеет значение, и в этом случае опция -l должна быть перед -c . Я прав?

2 ответа2

0

Да, ты прав. От man bash:

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

Это означает, что bash -c 'echo $0' -l возвращает -l .

0

В командах Unix существует соглашение, что имена файлов идут последними (потому что многие команды могут принимать практически неограниченное количество имен файлов). Другими словами, первое, что не похоже на флаг / опцию, интерпретируется как имя файла [1], как и все, что следует за ним.

[1] Если вы используете файл, начинающийся с тире, вы можете устранить неоднозначность двумя способами:

  • используя ./-foo вместо -foo: rm ./-foobar
  • используя '-' в конце истинных опций, так как многие команды интерпретируют это как конец опций и начало имен файлов: rm -- -foobar . Хорошие практики кодирования сценариев рекомендуют использовать -- "забор" в командах, где имена файлов не определены заранее.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .