3

Я просто читал о том, как работают оболочки Unix (в частности, bash ), и я попробовал что-то, что не имело для меня смысла.

Насколько я понимаю, source команда запускает программу, которую вы даете ей в текущем процессе оболочки, вместо того, чтобы разветвлять дочерний процесс.

С другой стороны, выполнение команды, за которой следует & возвращает управление пользователю до завершения запускаемого процесса. Если вы запускаете команду без source но с & , текущая оболочка возвращает управление пользователю до завершения дочернего процесса.

Но когда я создал файл с именем test.txt содержащий hello world , и запустил:

source /bin/cat test.txt

… Я получил -bash: ????: command not found .

Точно так же, когда я пытался загрузить свой virtualenv, используя

source ./venv/bin/activate &

Я только что получил статус выхода и идентификатор процесса [1] 26489

В чем дело? Особенно для второй команды. Я не совсем понимаю.

Как работает source , и что происходит, когда вы используете его с &?

1 ответ1

5

source загружает файл сценария bash и интерпретирует его в текущей среде оболочки. cat - это не скрипт bash, а двоичный программный файл, и bash не может успешно интерпретировать его содержимое как код скрипта. Кроме того, скрипты bash, не предназначенные для использования с source , возможно, будут плохо себя вести.

source filename [arguments]

Чтение и выполнение команд из filename в текущей среде оболочки и возврат состояния завершения последней команды, выполненной из filename . [...] Если предоставляются какие-либо аргументы, они становятся позиционными параметрами при выполнении имени файла. В противном случае позиционные параметры не изменяются. Статус возврата - это статус последней команды, вышедшей из скрипта (0, если команды не выполняются), и false, если filename не найдено или не может быть прочитано.

Когда вы запустите его с & , будет выполняться в фоновом режиме. Любое изменение статуса будет отображаться только тогда, когда приглашение будет напечатано в следующий раз, и оно будет выглядеть так:

[1]+  Done                    source .bashrc

Если вы действительно хотите запустить программу, которая заменяет оболочку, взгляните на exec .

   exec [-cl] [-a name] [command [arguments]]
          If command is specified, it replaces the shell.  No new  process
          is  created.  The arguments become the arguments to command.  [...]

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