Làm thế nào để buộc đồng hồ chạy dưới bash


18

Vấn đề là khi đồng hồ được thực thi, nó chạy shvà tôi gặp lỗi này:

sh: 1: func1: not found

đây là mã:

#!/bin/bash

func1(){
  echo $1
}

export -f func1

watch func1

Bạn có thể đưa ra lệnh nào bạn thực sự chạy?
cuonglm

@Gnouc thay vì echo $ 1 tôi có một đoạn script hơi dài nên tôi không biết ..
Rachid Oussanaa

Ý tôi là làm thế nào bạn chạy lệnh ssh của bạn?
cuonglm

@Gnouc ./bin/myfunc.sh
Rachid Oussanaa

Câu trả lời:


10

Ok, vì vậy có một vài vấn đề với cách tiếp cận của bạn.

Bạn đang xuất một hàm, không thể di chuyển giữa các shell. watchthực hiện các lệnh của nó với /bin/sh, mà trên hệ thống của bạn thì không bash. Và dù nó là cái gì, nó không tôn trọng chức năng xuất khẩu, do đó bạn sẽ gặp lỗi.

Thứ hai, bạn có thể thay đổi lệnh của mình thành một cái gì đó giống như watch bash -c 'func1', nhưng điều này cũng có thể không hoạt động tốt.
Lý do ở đây là bất kỳ biến nào được đặt bởi tập lệnh sẽ không có sẵn cho hàm. Bạn có thể xuất những thứ nó cần, nhưng điều đó bắt đầu trở nên lộn xộn.

Giải pháp an toàn nhất là tự đặt func1một tập lệnh và gọi tập lệnh đó.
 

Tóm lại, hãy thử:

watch bash -c func1

1
Nó rất nặng về CPU trong trường hợp chức năng được xác định trong.bash_profile
VarunAgw

@VarunAgw, đó là một điểm tốt. Tuy nhiên, đó là một lệnh tuyệt vời để giám sát mọi thứ trong một môi trường nơi .bash_profiletệp tương đối trống. Tuy nhiên, tôi đã muốn chạy một bí danh trong .bash_aliasestệp của mình ( có nguồn gốc từ tôi.bashrc ), vì vậy cuối cùng tôi cũng đã thêm -icờ vào bash. Tôi nghĩ rằng nó có thể giúp ai đó:watch bash -ic "func1; alias1; func2; …"
aaiezza

Chỉ watch -x bash -c my-funchoạt động với tôi trên Ubuntu Server 16.04 - trong khi những người khác thì không.
Nam G VU

14

Shell mặc định cho watch/bin/sh. Shell sẽ không kế thừa các biến hoặc hàm xuất từ ​​các loại shell khác.

Nếu hệ thống của bạn không liên kết /bin/shvới /bin/bash(hoặc trình bao hiện tại của bạn) thì bạn có thể hướng dẫn watchthực hiện trình bao của mình bằng cách sử dụng -xhoặc --exec:

watch -x bash -c "my_func"

hoặc là

watch --exec bash -c "my_func"

Điều này khác với watch bash -c "test_watch"(không bao gồm --exec) vì nó không sử dụng /bin/shđể sinh ra quá trình con (trong trường hợp này bash), duy trì bashtất cả các cách. Như được báo trước trong các câu trả lời khác, điều này có thể trở nên lộn xộn nếu xuất các hàm được kết hợp chặt chẽ với môi trường hiện tại (nghĩa là yêu cầu các biến hoặc hàm khác).


Một ví dụ:

test_watch() { echo 'Working!'; }
export -f test_watch
watch --exec bash -c "test_watch"

cho quen

Every 2.0s: bash -c test_watch                                   Thu Mar 31 11:15:56 2016

Working!

Chỉ watch -x bash -c my-funccó điều này hoạt động với tôi trên Ubuntu Server 16.04 - trong khi những người khác thì không. Cảm ơn rất nhiều!
Nam G VU

4

Tại sao chạy watchtừ bên trong kịch bản của bạn? Tại sao không có tập lệnh shell này:

$ cat func1 
#!/bin/bash

func1(){
  echo $1
}

func1 $1

... và sau đó chạy nó như vậy ...

$ watch func1 foo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.