Выполнение оболочки с командой и возврат - PullRequest
1 голос
/ 02 октября 2019

man bash, похоже, говорит о том, что если я хочу выполнить команду в отдельной оболочке bash, все, что мне нужно сделать, это bash -c command:

   -c string If the -c option is present, then commands are read from string.

Я хочу сделать это, потому что янеобходимо запустить несколько вещей в разных средах:

bash --rcfile ~/.bashrc.a -c mytest.a
bash --rcfile ~/.bashrc.b -c mytest.b

Однако это не сработало, как ожидалось;Можно видеть, что по количеству bash работающих оболочек, например:

$ bash
$ ps
  PID TTY          TIME CMD
 7554 pts/0    00:00:00 bash
 7573 pts/0    00:00:00 ps
28616 pts/0    00:00:00 bash
$ exit
exit
$ ps
  PID TTY          TIME CMD
 7582 pts/0    00:00:00 ps
28616 pts/0    00:00:00 bash
$ bash -c ps
  PID TTY          TIME CMD
 7583 pts/0    00:00:00 ps
28616 pts/0    00:00:00 bash

Как следует изменить вызов bash, чтобы запустить новую оболочку с указанным rc,выполните данную команду в этой оболочке (с env, измененным в соответствии с rc) и выйдите назад?

Ответы [ 2 ]

2 голосов
/ 02 октября 2019

Это уже работает именно так, как вы хотите. Отсутствие дополнительного процесса происходит просто из-за оптимизации хвостового вызова bash.

Bash признает, что нет смысла иметь экземпляр оболочки, единственной задачей которой является ожидание процесса и выход из него. Вместо этого он пропустит форк и exec процесс напрямую. Это огромный выигрыш, например, для var=$(ps), когда он сокращает количество дорогих форков с 2 до 1.

Если вы дадите ему дополнительные команды для запуска после этого, эта оптимизация больше не действительна, а затем выУвидим дополнительный процесс:

$ bash -c 'ps'
  PID TTY          TIME CMD
 4531 pts/10   00:00:00 bash
 4540 pts/10   00:00:00 ps

$ bash -c 'ps; exit $?'
  PID TTY          TIME CMD
 4531 pts/10   00:00:00 bash
 4549 pts/10   00:00:00 bash
 4550 pts/10   00:00:00 ps
1 голос
/ 02 октября 2019

bash --rcfile ~/.bashrc.a mytest.a уже будет запускаться mytest.a в отдельном процессе. -c предназначен для указания команды оболочки напрямую , а не для запуска сценария.

# NO!
bash for x in 1 2 3; do echo "$x"; done

# Yes.
bash -c 'for x in 1 2 3; do echo "$x"; done'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...