Проблема в том, что когда часы выполняются, они запускаются, 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 - а другие нет.
Оболочка по умолчанию для watch
is /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