Вы экспортируете функцию, которая не является переносимой между оболочками. watchвыполняет свои команды с /bin/sh, чего в вашей системе нет bash. И какая бы оболочка это ни была, она не учитывает экспорт функций, поэтому вы получаете ошибку.
Во-вторых, вы можете изменить свою команду на что-то вроде watch bash -c 'func1', но это также может не сработать.
Причиной здесь является то, что любые переменные, установленные скриптом, не будут доступны функции. Возможно, вы сможете экспортировать те, которые ему нужны, но это становится грязным.
Самое безопасное решение - это вставить func1скрипт самостоятельно и вызвать его.
@VarunAgw, это хороший момент. Тем не менее, это отличная команда для мониторинга вещей в среде, где .bash_profileфайл относительно пуст. Тем не менее, я хотел запустить псевдоним, который был в моем .bash_aliasesфайле ( получен через мой.bashrc ), поэтому я добавил -iфлаг в bash. Я думал, что это может помочь кому-то:watch bash -ic "func1; alias1; func2; …"
aaiezza
У watch -x bash -c my-funcменя работает только на Ubuntu Server 16.04 - а другие нет.
Нам G VU
14
Оболочка по умолчанию для watchis /bin/sh. Оболочки не будут наследовать экспортированные переменные или функции от других типов оболочки.
Если ваша система не симлинка /bin/shк /bin/bash(или текущая оболочки) , то вы можете указать , watchчтобы EXEC своей оболочки, используя -xили --exec:
watch -x bash -c "my_func"
или
watch --exec bash -c "my_func"
Это отличается от watch bash -c "test_watch"(исключая --exec), поскольку он не используется /bin/shдля порождения дочернего процесса (в данном случае bash), поддерживая bashвесь путь вниз. Как поясняется в других ответах, это может привести к путанице при экспорте функций, которые тесно связаны с текущей средой (т. Е. Требуются другие переменные или функции).
Ответы:
Итак, есть несколько проблем с вашим подходом.
Вы экспортируете функцию, которая не является переносимой между оболочками.
watch
выполняет свои команды с/bin/sh
, чего в вашей системе нетbash
. И какая бы оболочка это ни была, она не учитывает экспорт функций, поэтому вы получаете ошибку.Во-вторых, вы можете изменить свою команду на что-то вроде
watch bash -c 'func1'
, но это также может не сработать.Причиной здесь является то, что любые переменные, установленные скриптом, не будут доступны функции. Возможно, вы сможете экспортировать те, которые ему нужны, но это становится грязным.
Самое безопасное решение - это вставить
func1
скрипт самостоятельно и вызвать его.Короче попробуйте:
источник
.bash_profile
.bash_profile
файл относительно пуст. Тем не менее, я хотел запустить псевдоним, который был в моем.bash_aliases
файле ( получен через мой.bashrc
), поэтому я добавил-i
флаг в bash. Я думал, что это может помочь кому-то:watch bash -ic "func1; alias1; func2; …"
watch -x bash -c my-func
меня работает только на Ubuntu Server 16.04 - а другие нет.Оболочка по умолчанию для
watch
is/bin/sh
. Оболочки не будут наследовать экспортированные переменные или функции от других типов оболочки.Если ваша система не симлинка
/bin/sh
к/bin/bash
(или текущая оболочки) , то вы можете указать ,watch
чтобы EXEC своей оболочки, используя-x
или--exec
:или
Это отличается от
watch bash -c "test_watch"
(исключая--exec
), поскольку он не используется/bin/sh
для порождения дочернего процесса (в данном случаеbash
), поддерживаяbash
весь путь вниз. Как поясняется в других ответах, это может привести к путанице при экспорте функций, которые тесно связаны с текущей средой (т. Е. Требуются другие переменные или функции).Пример:
дает знакомый
источник
watch -x bash -c my-func
да, это работает для меня на Ubuntu Server 16.04 - а другие нет. Благодаря тонну!Зачем бежать
watch
изнутри вашего скрипта? Почему бы не иметь этот сценарий оболочки:... а затем запустить его так, как ...
источник