Làm thế nào tôi có thể thấy lệnh nào thực sự chạy trong shell, thông qua bí danh hoặc hàm


20

Tôi có một hàm bash (hoặc bí danh), ví dụ function install() {sudo apt-get install $@}. Khi chạy lệnh install dicelab, những gì tôi mong đợi sẽ thực sự được chạy là sudo apt-get install dicelab. Tôi có thể thấy những gì thực sự được chạy bởi vỏ? Tôi muốn chắc chắn rằng các bí danh phức tạp hơn của tôi đang hoạt động như mong đợi.


Có phải đó là $@một phần của bí danh của bạn? Hãy nhớ rằng các bí danh không thực sự hỗ trợ các đối số, điều đó sẽ mở rộng đến các tham số vị trí (nếu có) của bối cảnh gọi bí danh. Cách chạy thông thường somealias some argschỉ hoạt động bằng cách mở rộng bí danh và để các đối số tuân theo nó. Nếu bạn thực sự muốn có thể truy cập các đối số, hãy sử dụng một hàm và trích dẫn"$@"
ilkkachu


1
@AlonAviv, Tốt. :) Tuy nhiên, tốt nhất hãy tập thói quen trích dẫn điều đó "$@", các đối số có khoảng trắng hoặc ký tự toàn cục sẽ ghi khác.
ilkkachu

1
@DarkHeart Điều này không trùng lặp. Câu hỏi khác không liên quan đến chức năng shell.
Kusalananda

2
Không phải cái này cho đến khi nó được chỉnh sửa để thay đổi hoàn toàn chủ đề của nó (và làm mất hiệu lực một trong những câu trả lời hiện có).
Michael Homer

Câu trả lời:


29

Sử dụng set -xtrong vỏ.

$ alias hello='echo hello world!'
$ hello
hello world!

$ set -x
$ hello
+ echo hello world!
hello world!

Sử dụng set -xlần lượt trên các xtracetùy chọn vỏ ( set +xbiến nó off) và nên làm việc trong tất cả các Bourne giống như vỏ, giống như bash, dash ksh93, pdkshzsh. Điều này nhắc shell để hiển thị lệnh được thực thi sau khi mở rộng bí danh và mở rộng biến, v.v. đã được thực hiện.

Đầu ra sẽ nằm trên luồng lỗi tiêu chuẩn của shell (giống như dấu nhắc thông thường) vì vậy nó sẽ không can thiệp vào các chuyển hướng của đầu ra tiêu chuẩn và nó sẽ được đi trước bởi một dấu nhắc như được xác định bởi PS4biến shell ( +␣theo mặc định).

Ví dụ với một vài chức năng:

$ world () { echo "world"; }
$ hello () { echo "hello"; }
$ helloworld () { printf '%s %s!\n' "$(hello)" "$(world)"; }

$ helloworld
hello world!

$ set -x
$ helloworld
+ helloworld
++ hello
++ echo hello
++ world
++ echo world
+ printf '%s %s!\n' hello world
hello world!

Tôi đang chạy với set -xtất cả các shell tương tác của tôi theo mặc định. Thật tuyệt khi thấy những gì thực sự đã được thực thi ... nhưng tôi nhận thấy rằng việc hoàn thành tab có thể lập trình, v.v. có thể gây ra đầu ra dấu vết không mong muốn trong một số shell.


14

Bạn có thể sử dụng shell-expand-line, được ràng buộc với Control- Alt- etheo mặc định:

$ bind -p | grep shell-expand-line
"\e\C-e": shell-expand-line

Trong số những thứ khác, nó sẽ thay thế các bí danh trong dòng hiện tại bằng định nghĩa của chúng để bạn có thể thấy một lệnh bạn vẫn sẽ chạy. Thí dụ:

$ install dicelab # now press C-Alt-e
$ sudo apt-get install  dicelab # the above line will be replaced with this

đây là một tính năng tốt Bạn có biết nếu zsh có một lệnh tương đương shell-expand-line?
the_velour_fog

Xin lỗi, tôi không vì tôi không sử dụng zsh. Nhưng một số người đã đưa ra ý tưởng của riêng họ: wiki.math.cmu.edu/iki/wiki/tips/20140625-zsh-Exand-alias.html
Arkadiusz Drabchot


1

Bạn có thể sử dụng nội dung bash typeđể xem bí danh hoặc định nghĩa hàm bạn sẽ chạy:

$ type ls
ls is aliased to `ls --color=auto -p'

$ type -a ls
ls is aliased to `ls --color=auto -p'
ls is /bin/ls

$ install() { sudo apt-get install "@"; }

$ type install
install is a function
install () 
{ 
    aptitude install "@"
}
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.