Получить PID и код возврата из однострочного вызова bash

Вариант awk:

gawk '
      BEGIN{print "Description of the following table:"}
      {print $0}' file > temp && mv temp file

Здесь немного больше работы, чем у sed, потому что у sed есть опция редактирования на месте -i, с помощью которой вы можете напрямую писать в файл.

3
10.03.2017, 17:41
2 ответа

При запуске, например:

bash -c "echo $ BASHPID; exec sleep 10"

или

echo $ ( echo $ BASHPID; exec sleep 10)

ваша текущая оболочка интерполирует переменную $ BASHPID до того, как ее увидит второй bash (или подоболочка). Решение состоит в том, чтобы предотвратить расширение этих переменных текущей оболочкой:

bash -c 'echo $BASHPID ; exec sleep 10'
4
27.01.2020, 21:11

Это команда оболочки, которую вы уже выполняете по ssh (интерпретируется оболочкой входа в систему удаленного пользователя), нет необходимости запускать другую оболочка поверх этого. Предполагая, что оболочка похожа на Bourne или csh:

echo "$$"; exec sleep 10

должно быть достаточно. Нет необходимости устанавливать bash на удаленном хосте. ssh также сообщит о статусе выхода удаленной команды, печатать его не нужно. Но если вам нужно, вы можете сделать:

sleep 10 & echo "$!"; wait; echo "$?"

Не для csh-подобных оболочек, поскольку вместо $? есть $ status .

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

exec sh -c 'sleep 10 & echo "$!"; wait; echo "$?"'

Эта команда должна быть совместима, по крайней мере, с оболочками семейств Bourne, csh и rc.

4
27.01.2020, 21:11

Теги

Похожие вопросы