Bí danh trong quy trình con / con


15

Tôi thiết lập bí danh trong /etc/profile.d/alias.sh cho mỗi vỏ đăng nhập. Nhưng nếu tôi chạy script.sh, tôi không thể sử dụng bí danh đó. Làm cách nào tôi có thể đặt bí danh ngay cả cho các lớp con hoặc các tiến trình con?

/etc/profile.d/alias.sh

alias rmvr='rm -rv';
alias cprv='cp -rv';
alias mvrv='mv -rv';

Câu trả lời:


23

Bí danh không được kế thừa. Đó là lý do tại sao họ được thiết lập theo truyền thống bashrcvà không profile. Thay vào đó, bạn script.shlấy nguồn từ .bashrchệ thống của bạn hoặc toàn hệ thống.


Theo kế thừa, bạn có nghĩa là các biến xuất khẩu chẳng hạn được kế thừa và phần còn lại thì không?
lisak

1
Tôi không nghĩ rằng .bashrc giúp ... Nếu bạn sử dụng bí danh đó trong một mạng con, nó không biết điều đó
lisak

bashrc được đọc cho tất cả các shell không đăng nhập tương tác, đó là lý do tại sao nó nên hoạt động vì hầu hết các shell bạn khởi động đều là các shell không đăng nhập tương tác và các bí danh hoạt động trong các subshells với()
jw013

Tôi không biết về cách gọi aliasName (), cảm ơn bạn
lisak

Để rõ ràng, những gì tôi có nghĩa là trong bash alias foo='echo foobar', nhập, (foo)đầu ra foobar.
jw013

10

Đó là bởi vì /etc/profile.d/ chỉ được sử dụng bởi vỏ đăng nhập tương tác. Tuy nhiên, /etc/bash.bashrcđược sử dụng bởi vỏ không đăng nhập tương tác.

Vì tôi thường đặt một số bí danh toàn cầu cho hệ thống, tôi đã bắt đầu tạo /etc/bashrc.dnơi tôi có thể thả một tệp có một số bí danh toàn cầu:

    HAVE_BASHRC_D=`cat /etc/bash.bashrc | grep -F '/etc/bashrc.d' | wc -l`

    if [ ! -d /etc/bashrc.d ]; then
            mkdir -p /etc/bashrc.d
    fi
    if [ "$HAVE_BASHRC_D" == "0" ]; then
        echo "Setting up bash aliases"
            (cat <<-'EOF'
                                    if [ -d /etc/bashrc.d ]; then
                                      for i in /etc/bashrc.d/*.sh; do
                                        if [ -r $i ]; then
                                          . $i
                                        fi
                                      done
                                      unset i
                                    fi
                            EOF
            ) >> /etc/bash.bashrc

    fi

7

Nếu bạn muốn chúng được kế thừa vào các shell con, thay vào đó hãy sử dụng các hàm. Chúng có thể được xuất ra môi trường ( export -f) và các shell con sau đó sẽ có các hàm được định nghĩa.

Vì vậy, đối với một trong những ví dụ của bạn:

rmvr() { rm -rv "$@"; }
export -f rmvr

Nếu bạn có một loạt chúng, thì hãy đặt để xuất trước:

set -a # export the following funcs
rmvr() { rm -rv "$@"; }
cpvr() { cp -rv "$@"; }
mvrv() { mv -rv "$@"; }
set +a # stop exporting

0

Câu hỏi tương tự, tôi muốn chạy bash "chế độ lệnh" và có sẵn các bí danh:

bash -i 'alias'Không lam gi cả. Nhưng tôi đã phát hiện ra cờ -i chạy các thiết lập tương tác, vì vậy điều này: bash -ci 'alias'không hoạt động.

Đối với câu hỏi của bạn, xuất hiện bạn có thể loại bỏ nó bằng cách "tìm nguồn cung cấp" tệp, ví dụ:

 bash -ci '. script.sh'

Sau đó bí danh làm việc. VẬY ...

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.