Làm thế nào tôi có thể biết nếu tập lệnh bash hiện đang thực thi đã được gọi với -x để gỡ lỗi?


11

Tôi có một tập lệnh launch.shthực thi chính nó như một người dùng khác để tạo các tệp với chủ sở hữu chính xác. Tôi muốn chuyển -x cho lời gọi này nếu nó ban đầu được chuyển đến tập lệnh

if [ `whoami` == "deployuser" ]; then
  ... bunch of commands that need files to be created as deployuser
else
  echo "Respawning myself as the deployment user... #Inception"
  echo "Called with: <$BASH_ARGV>, <$BASH_EXECUTION_STRING>, <$->"
  sudo -u deployuser -H bash $0 "$@"  # How to pass -x here if it was passed to the script initially?
fi

Tôi đã đọc trang gỡ lỗi bash nhưng dường như không có tùy chọn rõ ràng nào cho biết liệu tập lệnh gốc có được khởi chạy hay không -x.

Câu trả lời:


15

Nhiều cờ có thể được chuyển qua bashtrên dòng lệnh là setcờ. setlà shell được tích hợp sẵn có thể chuyển đổi các cờ này khi chạy. Ví dụ, gọi một tập lệnh bash -x foo.shvề cơ bản giống như thực hiện set -xở đầu tập lệnh.

Biết rằng đó setlà vỏ tích hợp chịu trách nhiệm cho việc này cho chúng tôi biết nơi để tìm. Bây giờ chúng tôi có thể làm help setvà chúng tôi nhận được như sau:

$ help set
set: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
...
      -x  Print commands and their arguments as they are executed.
...
    Using + rather than - causes these flags to be turned off.  The
    flags can also be used upon invocation of the shell.  The current
    set of flags may be found in $-.  The remaining n ARGs are positional
    parameters and are assigned, in order, to $1, $2, .. $n.  If no
    ARGs are given, all shell variables are printed.
...

Vì vậy, từ điều này, chúng tôi thấy rằng $-sẽ cho chúng tôi biết những cờ nào được kích hoạt.

$ bash -c 'echo $-'
hBc

$ bash -x -c 'echo $-'
+ echo hxBc
hxBc

Vì vậy, về cơ bản bạn chỉ cần làm:

if [[ "$-" = *"x"* ]]; then
  echo '`-x` is set'
else
  echo '`-x` is not set'
fi

Như một phần thưởng, nếu bạn muốn sao chép tất cả các cờ, bạn cũng có thể làm

bash -$- /other/script.sh

1
Bạn sẽ cần sử dụng [[ $- == *x* ]]để khớp mẫu.
glenn jackman

1
Hoặc bạn có thể sử dụng tiêu chuẩn case $- in *x*) ... ;; *) ... ;; esac. Thật hữu ích khi biết cách sử dụng này casecho các tập lệnh có nghĩa là có thể mang theo được, và bây giờ tôi biết về nó, tôi thấy dễ dàng hơn để nhớ điều đó, hơn là nhớ "nếu cụ thể là bash, thì [[khác case".
hvd

OK, sau đó toàn bộ loạt ý kiến ​​có thể bị xóa.
l0b0

$-đầu ra hB. Làm gì -h-Bcờ / đối số làm gì? Đừng nhìn thấy sau đó trong trang bash man .
Dan Dascalescu

3

set -osẽ xuất xtrace onnếu -xđược sử dụng, nếu không xtrace off.


2

Mặc dù câu trả lời của @Patrick là câu trả lời "đúng", bạn cũng có thể chuyển một tham số hoặc biến xuất vào tập lệnh con để cho nó biết phải làm gì - như bật theo dõi.

Điều này có nhược điểm là (tôi tin) bạn phải xuất lại nó cho từng cấp độ kịch bản bạn sắp nhập.

Nó có lợi thế là có thể theo dõi có chọn lọc (hoặc ảnh hưởng khác) chỉ các tập lệnh mà bạn cần hành vi đầu ra / sửa đổi từ - để cắt giảm đầu ra không liên quan, v.v. Ví dụ: có thể tắt theo dõi cho tập lệnh gọi và vẫn được bật trong tập lệnh được gọi. Đó không phải là một đề xuất tất cả hoặc không có gì.

Không phải là một phần của câu hỏi của bạn, nhưng có liên quan:

Đôi khi tôi định nghĩa một biến như

E=""
E="echo "

hoặc là

E=""
E=": "

và sử dụng nó (trong nhiều câu lệnh) như

"${E}" rsync ...

hoặc, chỉ cho biến thể thứ hai,

"${E}" echo "this is a debugging message"

Sau đó, tôi chỉ nhận xét định nghĩa thứ hai khi tôi muốn (các) lệnh chạy. Bạn cũng có thể sử dụng kỹ thuật này với một tham số hoặc biến xuất.

Với một trong hai điều này, bạn phải coi chừng các câu lệnh ghép vì phương thức này chỉ được đảm bảo để hoạt động trên câu lệnh đầu tiên trong danh sách ghép.


1

Bạn có thể lấy PID của quá trình và sau đó kiểm tra bảng quy trình với ps để xem đối số của nó là gì.


Bạn có thể lấy quy trình 'PID qua: $$
Paul Calabro

2
Tôi không nghĩ rằng đó là một ý tưởng tốt nói chung, bởi vì nếu -xđược đặt trong tập lệnh, nó sẽ không được hiển thị ở psđầu ra. Và giải pháp này là không hiệu quả.
vinc17

Đó là một lập luận công bằng. Tôi thực sự không biết về biến $ -. Đó dường như là một cách tiếp cận tốt hơn để giải quyết điều này.
Paul Calabro

1
Ngoài ra còn có set -ogiải pháp tôi đã đề xuất. Nó cũng sẽ hoạt động cho các tùy chọn không có cờ liên quan như -x.
vinc17
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.