it-swarm-vi.com

Tại sao tập lệnh Bash của tôi không nhận ra bí danh?

Trong tôi ~/.bashrc tập tin nằm trong hai định nghĩa:

  1. commandA, là bí danh cho một đường dẫn dài hơn
  2. commandB, là bí danh của tập lệnh Bash

Tôi muốn xử lý cùng một tệp với hai lệnh này, vì vậy tôi đã viết tập lệnh Bash sau:


#!/bin/bash

for file in "[email protected]"
    do
    commandA $file
    commandB $file
done

Ngay cả sau khi đăng xuất khỏi phiên của tôi và đăng nhập lại, Bash vẫn nhắc tôi với command not found lỗi cho cả hai lệnh khi tôi chạy tập lệnh này.

Tôi đang làm gì sai?

237
Zaid

Trước hết, như ddeimeke đã nói, các bí danh theo mặc định không được mở rộng trong các vỏ không tương tác.

Thứ hai, .bashrc không được đọc bởi các shell không tương tác trừ khi bạn đặt BASH_ENV biến môi trường.

Nhưng quan trọng nhất: đừng làm vậy! Xin vui lòng? Một ngày nào đó bạn sẽ di chuyển tập lệnh đó đến một nơi mà các bí danh cần thiết không được đặt và nó sẽ bị hỏng lần nữa.

Thay vào đó, hãy đặt và sử dụng các biến môi trường làm các phím tắt trong tập lệnh của bạn:

#!/bin/bash

CMDA=/path/to/gizmo
CMDB=/path/to/huzzah.sh

for file in "[email protected]"
do
    $CMDA "$file"
    $CMDB "$file"
done
125
user601

Nếu bạn nhìn vào trang bash bạn tìm thấy:

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_aliases được đặt bằng shopt (xem mô tả về shopt trong Shell BUILTIN THÔNG TIN bên dưới).

Vì vậy, đặt một

shopt -s expand_aliases

trong kịch bản của bạn.

Đảm bảo nguồn tệp bí danh của bạn sau khi đặt tệp này trong tập lệnh của bạn.

shopt -s expand_aliases
source ~/.bash_aliases
175
ddeimeke

Các bí danh không thể được xuất để chúng không có sẵn trong các tập lệnh Shell mà chúng không được xác định. Nói cách khác, nếu bạn xác định chúng trong ~/.bashrc chúng không có sẵn cho your_script.sh (trừ khi bạn nguồn ~/.bashrc trong tập lệnh, điều mà tôi không khuyến nghị nhưng có nhiều cách để làm điều này đúng cách).

Tuy nhiên, các hàm có thể được xuất và sẽ có sẵn cho các tập lệnh Shell được chạy từ một môi trường mà chúng được xác định. Điều này có thể được thực hiện bằng cách đặt cái này trong bashrc của bạn:

[.__.] foo () [.__.] {[.__.]

Như hướng dẫn của Bash nói, "Đối với hầu hết mọi mục đích, các hàm Shell được ưu tiên hơn các bí danh."

[cmd line] > bash -i [your script's file path]

i là để tương tác và cung cấp hồ sơ bash cho bạn.

11
user65576