Bash: Sử dụng bí danh trong một biến


9

Tôi đang viết một tập lệnh bash chạy từng đối số của nó dưới dạng một lệnh. Điều này làm việc cho các lệnh trong của tôi PATH, nhưng không phải cho bí danh. Tôi có thể gọi trực tiếp một bí danh trong kịch bản, nhưng tôi không thể gọi một bí danh đã được thông qua như một đối số.

Vấn đề (tôi giả sử) là bí danh được mở rộng trước các biến. Có cách nào để chạy bí danh từ một biến không?

Kịch bản mẫu:

#!/bin/bash
# File: runall

shopt -s expand_aliases
source ~/.aliases

while (( "$#" )); do
    $1
    shift
done

runall "echo test"hoạt động, nhưng runall "myalias"chorunall: line 8: myalias: command not found

Câu trả lời:


9

Sau một số thử nghiệm, tôi đã kết luận như sau:

  • Bí danh chỉ hoạt động trong chế độ tương tác (thêm -ivào shebang).
  • Các bí danh không được đánh giá khi chúng đến từ một nguồn được giải thích (trong trường hợp này là biến.
  • Bạn có thể nhận bash để sử dụng bí danh eval $1. Lưu ý rằng evaling bất cứ thứ gì được tạo bằng một biến đều nguy hiểm, nhưng vì toàn bộ điểm của tập lệnh yêu cầu thực thi tùy ý, tôi sẽ không thực hiện một thỏa thuận quá lớn từ đó.

Từ trang bash man:

Các bí danh không được mở rộng khi shell không tương tác, trừ khi tùy chọn shell extend_aliases được đặt bằng shopt (xem mô tả về shopt trong SHELL BUILTIN THÔNG TIN bên dưới).

Vì vậy, bạn có thể thêm shopt -s expand_aliasesthay vì -i.

Cũng thế,

Các bí danh được mở rộng khi một lệnh được đọc, không phải khi nó được thực thi.

Vì các biến không được mở rộng trước khi lệnh được đọc, nên chúng sẽ không được mở rộng thêm bằng cách sử dụng bí danh.


1
Rất vui được biết. Chỉ tò mò: tại sao nó nguy hiểm với evalcác biến?

1
@hesse Hãy xem xét eval "echo $1". Nói tôi gọi ./script.sh "hello;rm -rf ~. Điều gì được thực hiện? echo hello, theo sau rm -rf ~. Rõ ràng đó là một ví dụ giả định, nhưng nguyên tắc là đúng.
Kevin

thêm evalvào trước khi $1làm việc, vì tôi đã có shopt -s expand_aliases. Cảm ơn!
Jayson

1

Tôi đã có một vấn đề tương tự và quản lý để giải quyết vấn đề của mình bằng cách chuyển các bí danh của mình thành các chức năng, như được mô tả trên trang web này , hoạt động cho tôi.

ví dụ

alias lsd="ls -lash"

đến

function lsd() { ls -lash; }
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.