Intereting Posts
Соединение NIC с использованием VirtualBox не работает должным образом Проблемы с неразрешенными зависимостями от Debian 6 Sqeeze гостевой подкаталог в / media? Удалить всю переменную окружения и загрузить rcfile Как создать пользовательский debian liveCD (настроить, какие пакеты предустановлены)? «Apt-get install» заканчивается ошибкой сегментации Traceroute работает (очень медленно), но интернет не работает Гостевая ОС Ubuntu 12.04 нет сетевого подключения Как я могу автоматически отключить свой компьютер ночью? Автоматически устанавливать атрибут append для вновь созданных файлов / папок? Как проверить ошибку server.conf для OpenVPN bash 'nounset' на sub-shell / child не заставляет основной скрипт выйти, как обходить это глобально? Поиск 32-битного файла ELF Я получаю E: Пакет 'libgsl0ldbl' не имеет кандидата на установку при установке ns3 в ubuntu 16.04 git вытащить из пульта дистанционного управления, но такой рефлекс не был получен?

Как запустить командный блок в основной оболочке?

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

🌐 echo $BASHPID 18884 🌐 (echo "hello $BASHPID";sleep 5;echo "hello again $BASHPID") hello 22268 hello again 22268 

Я также пробовал:

 . (echo "hello $BASHPID";sleep 5;echo "hello again $BASHPID") source (echo "hello $BASHPID";sleep 5;echo "hello again $BASHPID") 

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

Я думаю, это сработает, если я положу команды внутри файла и запустим его с помощью исходной команды, но я хотел бы знать, есть ли способ создать файл сценария.

Вместо ( something ) , которое запускает something в подоболочке, используйте { something ; } { something ; } , который запускает something в текущей оболочке

Вам нужны пробелы после { , а также должны иметь ; (или новой строки) перед } .

Пример:

 $ { echo "hello $BASHPID";sleep 5;echo "hello again $BASHPID" ; } hello 3536 hello again 3536 

Обратите внимание, что если вы запустите несколько сложных команд (или команд с каналами), они будут в большинстве случаев в любой момент времени.

И «портативный» способ получить ваш текущий pid оболочки – $$ .

Поэтому я вместо этого напишу свой тест как:

 { echo "hello $$"; sleep 5 ; echo "hello again $$" ; } 

(сна все равно не очень полезен)

Зависит от того, что вы имеете в виду в целом .

Если вы имеете в виду только отправку нескольких команд в оболочку и убедитесь, что оболочка не запускает их до тех пор, пока вы их не введете, вы можете просто сделать:

 cmd1; cmd2 

Или

  cmd1 Ctrl + V Ctrl + J cmd2 

(или включить скобку-вставку ( bind 'set enable-bracketed-paste on' ) и вставить команды с терминала, который поддерживает скобку в скобках).

Или:

 { cmd1 cmd2 } 

Чтобы они были на нескольких строках.

Если вы хотите сгруппировать их, чтобы они использовали один и тот же stdin или stdout, например, вы могли бы использовать:

 { cmd1; cmd2; } < in > out 

Или

 eval 'cmd1; cmd2' < in > out 

Если вы хотите, чтобы они запускались со своей переменной и областью параметров, так как bash не имеет эквивалента анонимных функций zsh , вам нужно определить временную функцию:

 f() { local var; var=foo; bar;}; f