Проблема полягає в тому, що при перегляді годинника він працює, 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є /bin/sh. Оболонки не будуть успадковувати експортовані змінні чи функції від інших типів оболонки.
Якщо ваша система не має посилання /bin/shна /bin/bash(або поточну оболонку), ви можете доручити watchвиконувати оболонку, використовуючи -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