Проблема в том, что когда часы выполняются, они запускаются, shи я получаю эту ошибку:
sh: 1: func1: not found
вот код:
#!/bin/bash
func1(){
echo $1
}
export -f func1
watch func1
Проблема в том, что когда часы выполняются, они запускаются, shи я получаю эту ошибку:
sh: 1: func1: not found
вот код:
#!/bin/bash
func1(){
echo $1
}
export -f func1
watch func1
Ответы:
Итак, есть несколько проблем с вашим подходом.
Вы экспортируете функцию, которая не является переносимой между оболочками. watchвыполняет свои команды с /bin/sh, чего в вашей системе нет bash. И какая бы оболочка это ни была, она не учитывает экспорт функций, поэтому вы получаете ошибку.
Во-вторых, вы можете изменить свою команду на что-то вроде watch bash -c 'func1', но это также может не сработать.
Причиной здесь является то, что любые переменные, установленные скриптом, не будут доступны функции. Возможно, вы сможете экспортировать те, которые ему нужны, но это становится грязным.
Самое безопасное решение - это вставить func1скрипт самостоятельно и вызвать его.
Короче попробуйте:
watch bash -c 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 - а другие нет.
Оболочка по умолчанию для 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весь путь вниз. Как поясняется в других ответах, это может привести к путанице при экспорте функций, которые тесно связаны с текущей средой (т. Е. Требуются другие переменные или функции).
Пример:
test_watch() { echo 'Working!'; }
export -f test_watch
watch --exec bash -c "test_watch"
дает знакомый
Every 2.0s: bash -c test_watch Thu Mar 31 11:15:56 2016
Working!
watch -x bash -c my-funcда, это работает для меня на Ubuntu Server 16.04 - а другие нет. Благодаря тонну!
Зачем бежать watchизнутри вашего скрипта? Почему бы не иметь этот сценарий оболочки:
$ cat func1
#!/bin/bash
func1(){
echo $1
}
func1 $1
... а затем запустить его так, как ...
$ watch func1 foo