นามแฝงในกระบวนการ subshell / child


16

ฉันตั้งค่านามแฝงใน /etc/profile.d/alias.sh สำหรับแต่ละเชลล์ล็อกอิน แต่ถ้าฉันใช้งาน script.sh ฉันจะใช้นามแฝงนั้นไม่ได้ ฉันจะตั้งชื่อแทนอย่างไรสำหรับ subshells หรือกระบวนการลูก?

/etc/profile.d/alias.sh

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

คำตอบ:


24

นามแฝงไม่ได้รับการสืบทอด นั่นเป็นเหตุผลที่พวกเขาจะตั้งแบบดั้งเดิมในและไม่ได้bashrc profileแหล่งที่มาของคุณscript.shจากของคุณ.bashrcหรือทั้งระบบแทน


โดยการสืบทอดคุณหมายถึงว่าเช่นตัวแปรที่ส่งออกจะสืบทอดและส่วนที่เหลือไม่ได้?
Lisak

1
ฉันไม่คิดว่า. bashrc จะช่วย ... หากคุณใช้นามแฝงนั้นแล้วใน subshell มันก็ไม่รู้
lisak

bashrc คือการอ่านสำหรับทุกเปลือกหอยที่ไม่ได้เข้าสู่ระบบแบบโต้ตอบซึ่งเป็นเหตุผลที่นี้ควรจะทำงานตั้งแต่เปลือกหอยที่สุดที่คุณจะเริ่มต้นขึ้นเปลือกหอยที่ไม่เข้าสู่ระบบการโต้ตอบและชื่อแทนทำผลงานใน subshells กับ()
jw013

ฉันไม่รู้เกี่ยวกับการเรียก aliasName () ขอขอบคุณ
lisak

เพียงเพื่อจะชัดเจนสิ่งที่ฉันหมายถึงอยู่ในทุบตีalias foo='echo foobar'ใส่, เอาท์พุท(foo) foobar
jw013

11

เป็นเพราะ /etc/profile.d/ ถูกใช้โดยเชลล์ล็อกอินแบบโต้ตอบเท่านั้น อย่างไรก็ตาม/etc/bash.bashrcถูกใช้โดยเชลล์ที่ไม่ใช่การล็อกอินแบบโต้ตอบ

เนื่องจากฉันมักจะตั้งชื่อแทนส่วนกลางสำหรับระบบฉันได้เริ่มสร้าง/etc/bashrc.dตำแหน่งที่ฉันสามารถวางไฟล์ด้วยชื่อแทนส่วนกลางบางอย่าง:

    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

8

หากคุณต้องการให้สืบทอดไปยัง sub-shells ให้ใช้ฟังก์ชั่นแทน สิ่งเหล่านั้นสามารถส่งออกไปยังสภาพแวดล้อม ( export -f) และเปลือกย่อยจะกำหนดฟังก์ชั่นเหล่านั้น

ดังนั้นสำหรับหนึ่งในตัวอย่างของคุณ:

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

หากคุณมีเครือข่ายเหล่านั้นให้ตั้งค่าสำหรับการส่งออกก่อน:

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

0

คำถามที่คล้ายกันฉันต้องการเรียกใช้ทุบตี "โหมดคำสั่ง" และมีนามแฝงอยู่:

bash -i 'alias'ไม่ทำอะไรเลย แต่ฉันค้นพบแฟล็ก -iซึ่งใช้การตั้งค่าแบบโต้ตอบดังนั้นสิ่งนี้: bash -ci 'alias'ใช้งานได้

สำหรับคำถามของคุณปรากฏว่าคุณสามารถหลีกเลี่ยงได้โดย "การจัดหา" ไฟล์เช่น:

 bash -ci '. script.sh'

จากนั้นนามแฝงทำงาน FWIW ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.