Проблема полягає в тому, що при перегляді годинника він працює, 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