Vấn đề là khi đồng hồ được thực thi, nó chạy sh
và 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
Vấn đề là khi đồng hồ được thực thi, nó chạy sh
và 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
Câu trả lời:
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. watch
thự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 func1
một tập lệnh và gọi tập lệnh đó.
Tóm lại, hãy thử:
watch bash -c func1
.bash_profile
.bash_profile
tệp tương đối trống. Tuy nhiên, tôi đã muốn chạy một bí danh trong .bash_aliases
tệ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 -i
cờ vào bash. Tôi nghĩ rằng nó có thể giúp ai đó:watch bash -ic "func1; alias1; func2; …"
watch -x bash -c my-func
hoạt động với tôi trên Ubuntu Server 16.04 - trong khi những người khác thì không.
Shell mặc định cho watch
là /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/sh
vớ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 watch
thực hiện trình bao của mình bằng cách sử dụng -x
hoặ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ì bash
tấ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!
watch -x bash -c my-func
có đ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!