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
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
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. 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
.bash_profile
.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; …"
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.
Shell mặc định cho watchlà /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!
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!