Як змусити годинника бігати під баш


18

Проблема полягає в тому, що при перегляді годинника він працює, shі я отримую цю помилку:

sh: 1: func1: not found

ось код:

#!/bin/bash

func1(){
  echo $1
}

export -f func1

watch func1

Чи можете ви дати, яку команду ви насправді виконуєте?
cuonglm

@Gnouc замість відлуння $ 1 У мене є трохи довгий сценарій, тому я не знаю ..
Rachid Oussanaa

Я маю на увазі, як ти запустив свою команду ssh?
cuonglm

@Gnouc ./bin/myfunc.sh
Rachid Oussanaa

Відповіді:


10

Гаразд, тому з вашим підходом є кілька питань.

Ви експортуєте функцію, яка не переноситься між оболонками. watchвиконує свої команди з /bin/sh, що у вашій системі немає bash. І яка б вона не була, вона не поважає експорт функцій, тому ви отримуєте помилку.

По-друге, ви можете змінити свою команду на щось подібне watch bash -c 'func1', але це може не працювати і добре.
Причина в тому, що будь-які змінні, встановлені сценарієм, не будуть доступні функції. Можливо, ви зможете експортувати потрібні, але це стає брудно.

Найбезпечніше рішення - ввести func1сценарій сам по собі і викликати цей сценарій.
 

Якщо коротко, спробуйте:

watch bash -c func1

1
Це дуже інтенсивно процесор, якщо функція визначена в.bash_profile
VarunAgw

@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 - а інші - ні.
Нам Г ВУ

14

Оболонка по замовчуванням 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 - в той час як інші - ні. Дякую тонну!
Нам Г ВУ

4

Навіщо бігати watchвсередині вашого сценарію? Чому б не було цього сценарію оболонки:

$ cat func1 
#!/bin/bash

func1(){
  echo $1
}

func1 $1

... а потім запустити так, як ...

$ watch func1 foo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.