Có thể in ra mở rộng vỏ?


18

Tôi biết có một bộ quy tắc cụ thể mà shell mở rộng các lệnh người dùng đã gõ. (hãy nói về bash shell.)

Có thể in ra một lệnh trong biểu mẫu sau khi mở rộng shell? Nó dường như là một tiện ích tốt để tìm hiểu và đảm bảo cách shell mở rộng các ký tự đặc biệt.

ví dụ

$ echo *

{all the filenames in current dir}

Tôi muốn in ra lệnh mở rộng, đó là dòng sau:

echo {all the filenames in .}

Câu trả lời:


13

Chỉ cần sử dụng echo... đặt nó trước lệnh bạn muốn mở rộng. Tôi sử dụng điều này khá thường xuyên.

$ ls
one.txt
two.txt
three.dat
$ echo rm *.txt
rm one.txt two.txt
$ rm *.txt

Bạn có thể sử dụng HomeDelnhanh chóng thêm / xóa phần trước echo.

EDIT
Như đã chỉ ra trong các ý kiến, điều này sẽ không hoạt động nếu lệnh không chỉ là một lệnh đơn giản (như nếu nó là một forvòng lặp, sử dụng các đường ống |, hoặc &&hoặc bất cứ thứ gì như thế).


1
Đây là những gì tôi làm khi thử nghiệm một kịch bản
Barmar

Điều này vẫn bị ảnh hưởng bởi các mã thông báo shell khác echo cat * | someprogramkhông làm những gì bạn có thể nghĩ từ câu trả lời này.
Kroltan

13

Bạn có thể sử dụng set -x.

Ví dụ: xem xét tập lệnh:

$ cat script.sh
set -x
echo *

Khi chạy, nó hiển thị echocâu lệnh mở rộng trước khi thực sự thực hiện nó:

$ bash script.sh
+ echo file1 file2 file3 script.sh
file1 file2 file3 script.sh

Và, như Kundor chỉ ra, điều này cũng hoạt động tương tác trên dòng lệnh:

$ set -x
+ set -x
$ echo *
+ echo file1 file2 file3 script.sh
file1 file2 file3 script.sh

Tài liệu

man bashgiải thích những gì set -xnhư sau:

Sau khi mở rộng từng lệnh đơn giản, đối với lệnh, lệnh case, lệnh chọn hoặc số học cho lệnh, hiển thị giá trị mở rộng của PS4, theo sau là lệnh và các đối số mở rộng hoặc danh sách từ liên quan.

Giá trị mặc định cho PS4, như được hiển thị ở trên, một dấu cộng theo sau là khoảng trắng.


2
Và nó cũng hoạt động tốt trong một vỏ tương tác (mà tôi nghĩ OP đang tìm kiếm.)
Nick Matteo

7

Đối với hệ vỏ tương tác, nhấn Ctrl+xtheo *sau khi nhập mẫu hình cầu sẽ chỉnh sửa dòng lệnh của bạn với mẫu hình cầu đó được mở rộng. Từ trang bash man:

toàn cầu mở rộng ( C-x *)

Từ trước điểm được coi là mẫu để mở rộng tên đường dẫn và danh sách tên tệp phù hợp được chèn, thay thế từ. Nếu một đối số số được cung cấp, dấu hoa thị sẽ được nối trước khi mở rộng tên đường dẫn.

Bạn cũng có thể quan tâm đến việc mở rộng danh sách toàn cầu ( Ctrl+x, g).


Tôi đang sử dụng bash từ Mac OS. Tôi đã thử ctrl + x, lệnh + x. Tôi không chắc chắn nếu nó thực hiện bất kỳ chỉnh sửa dòng lệnh. bạn có thể nói rõ hơn không?
Weishi Zeng

@WeishiZeng Tôi không biết tại sao nó không hiệu quả với bạn. Bạn đã nhấn Ctrl+x, *ngay sau khi gõ echo *và trước khi nhấn phím enter? Nếu nó vẫn không hoạt động, bạn có thể sửa đổi ~/.inputrcvà liên kết toàn cầu mở rộng từ này sang thứ khác.
jamesdlin

contrl + x di chuyển con trỏ đến từ echo, nhưng không chỉnh sửa gì cả. "Ctrl + x " , có nghĩa là gì ?? (có phải là ctrl + x HOẶC ctrl + ??) * trên Shift, vì vậy tôi cũng cần nhấn Shift để có dấu *, phải không?
Weishi Zeng

Phải, nhấn Ctrl+xtheo sau Shift+8. Bạn có thể thử seing nếu Ctrl+x, ghoạt động, hoặc, như tôi đã nói trước đó, gán khóa riêng của bạn trong .inputrctệp.
jamesdlin

1

Nếu bạn muốn xem làm thế nào các đối số được mở rộng hoặc mã thông báo, bạn có thể sử dụng một chương trình hoặc tập lệnh in ra các đối số của nó. Đây là một triển khai trong bash:

#!/bin/bash

for (( i = 0; i <= $#; ++i )); do
    printf 'argv[%d] = %s\n' $i "${!i}"
done

Giả sử bạn đặt nó trong một tệp có tên printargs.sh(và làm cho nó có thể thực thi được), thì bạn sẽ nhận được đầu ra như thế này

$ ./printargs.sh a{1..3}b
argv[0] = ./printargs.sh
argv[1] = a1b
argv[2] = a2b
argv[3] = a3b
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.