Как заставить часы бегать под баш

18

Проблема в том, что когда часы выполняются, они запускаются, shи я получаю эту ошибку:

sh: 1: func1: not found

вот код:

#!/bin/bash

func1(){
  echo $1
}

export -f func1

watch func1
Рашид Уссанаа
источник
Можете ли вы дать команду, которую вы на самом деле выполняете?
cuonglm
@Gnouc вместо echo $ 1 у меня есть немного длинный сценарий, так что я не знаю ..
Rachid Oussanaa
Я имею в виду, как вы запустили команду ssh?
cuonglm
@Gnouc ./bin/myfunc.sh
Рашид Уссанаа,

Ответы:

10

Итак, есть несколько проблем с вашим подходом.

Вы экспортируете функцию, которая не является переносимой между оболочками. watchвыполняет свои команды с /bin/sh, чего в вашей системе нет bash. И какая бы оболочка это ни была, она не учитывает экспорт функций, поэтому вы получаете ошибку.

Во-вторых, вы можете изменить свою команду на что-то вроде watch bash -c 'func1', но это также может не сработать.
Причиной здесь является то, что любые переменные, установленные скриптом, не будут доступны функции. Возможно, вы сможете экспортировать те, которые ему нужны, но это становится грязным.

Самое безопасное решение - это вставить func1скрипт самостоятельно и вызвать его.
 

Короче попробуйте:

watch bash -c func1
Патрик
источник
1
Это очень сильно .bash_profile
загружает
@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весь путь вниз. Как поясняется в других ответах, это может привести к путанице при экспорте функций, которые тесно связаны с текущей средой (т. Е. Требуются другие переменные или функции).


Пример:

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 - а другие нет. Благодаря тонну!
Нам G VU
4

Зачем бежать watchизнутри вашего скрипта? Почему бы не иметь этот сценарий оболочки:

$ cat func1 
#!/bin/bash

func1(){
  echo $1
}

func1 $1

... а затем запустить его так, как ...

$ watch func1 foo
Красный крикет
источник