Có cách nào để tạo một tập lệnh và làm cho nó có thể thực thi được với ít mã hơn cái này không?


8

Mã của tôi để tạo một tập lệnh thực thi

touch script.sh && echo "echo 'Hello World'" > script.sh && sudo chmod +x script.sh

2
@ShamFiorin Tôi muốn nhấn mạnh phần đầu tiên của câu trả lời món tráng miệng. Bạn nên cố gắng sử dụng sudomột cách tiết kiệm. Tập thói quen ném nó xung quanh có thể nguy hiểm. Trong trường hợp này, bạn sở hữu tập lệnh bạn đã tạo để bạn có thể làm bất cứ điều gì bạn muốn với các quyền, không cần sudo.
Marie

2
Liên quan một cách tổng quát: Mẹo chơi gôn ở Bash
Chấn thương kỹ thuật số

Câu trả lời:


18

Bạn có thể bỏ toàn bộ touchlệnh và không cần sử dụng sudo. Để rút ngắn dòng lệnh hơn nữa, bạn có thể sử dụng bashMở rộng Lịch sử để lưu tên tệp lần thứ hai và bỏ qua các khoảng trắng không cần thiết:

echo "echo 'Hello World'" >script.sh&&chmod +x !#:3

Lịch sử mở rộng thay thế !#:3bằng từ thứ tư từ dòng lệnh hiện tại, trong trường hợp của bạn là tên tệp script.sh. Tất nhiên điều này cần phải được điều chỉnh trong trường hợp bạn sửa đổi lệnh đầu tiên, ví dụ:

>script.sh echo "echo 'Hello World'"&&chmod +x !#:1

Lưu ý rằng một tập lệnh hợp lệ cần một shebang :

>script.sh echo -e "#!/bin/bash\necho 'Hello World'"&&chmod +x !#:1

Nếu bạn cần chuỗi lệnh này thường xuyên hơn, tôi khuyên bạn nên xác định hàm , theo cách này, bạn chỉ cần nhập tên hàm. Một cách thích ứng tương tự - mặc dù dài hơn là cách sử dụng một biến giữ tên tệp:

f=script.sh;>$f echo "echo 'Hello World'"&&chmod +x $f

Nếu tên tệp của bạn chứa các ký tự đặc biệt, đừng quên trích dẫn chúng đúng cách .


20

Các installlệnh (một phần của GNU coreutils cùng với cp, mv, rm, vv) có thể sao chép một tập tin đồng thời cũng thiết lập quyền sở hữu và quyền của mình và tạo ra các thư mục mẹ khi cần thiết. Theo mặc định, nó sẽ làm cho tập tin mới thực thi. Nó không hiểu ' -' nhưng /dev/stdincó thể được sử dụng thay thế:

install /dev/stdin script.sh <<< "echo Hello World"

Ở trên sử dụng ' chuỗi ở đây ' để cung cấp văn bản trên stdin, ngắn hơn một chút so với đường dẫn. Các đối số echokhông cần trích dẫn trừ khi chúng chứa các ký tự có ý nghĩa đặc biệt.


lưu ý rằng herestring là một Bashism - một di sản sẽ được di động
Steven Penny

3
Ý kiến ​​hay. Bạn cũng có thể sử dụng thay thế quy trình :install <(echo echo Hello World) script.sh
Chấn thương kỹ thuật số

8

Tôi thích sử dụng catcho các nhiệm vụ như thế này:

cat > script.sh && chmod +x script.sh
#!/bin/sh
echo 'Hello World'Enter
Ctrl+D

1

Bạn cũng có thể bỏ toàn bộ chmod và sử dụng umask thay vì trước tiếng vang. Nên tiết kiệm cho bạn một vài byte. Shebang là tùy chọn miễn là bạn sử dụng các lệnh được hiểu bởi mọi shell (chủ yếu là bourne và C).


5
Làm thế nào bạn sẽ làm điều đó chính xác?
wjandrea

Theo umaskmặc định , không thể sử dụng để thiết lập bit thực thi ...
Ravexina
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.