ค้นหาว่าสคริปต์ใดที่ถูกเรียกใช้โดยการทุบตีเมื่อเริ่มต้น


15

หลังจากเริ่มต้น bash terminal ฉันสังเกตเห็นว่าตัวแปร PATH มีรายการที่ซ้ำกัน ขั้วของฉันเริ่มต้นเปลือกเข้าสู่ระบบเพื่อให้~/.bash_profileมีที่มาตามด้วยและ~/.profile ~/.bashrcใน~/.profileฉันจะสร้างรายการเส้นทางที่ซ้ำกัน

นี่คือลำดับที่ไฟล์ที่ควรจะมีแหล่งที่มาจะถูกแหล่งที่มา:

Sourced /etc/profile
Sourced /etc/bash.bashrc
Sourced .bash_profile
Sourced .profile
Sourced .bashrc

ก่อนที่ทุกคนจะทำเครื่องหมายสิ่งนี้ว่าเป็น "สำเนาของตัวแปร PATH ที่มีรายการซ้ำ" โปรดอ่านต่อไป

ตอนแรกฉันคิดว่าสิ่งนี้เกี่ยวข้องกับ~/.profileการจัดหาแหล่งข้อมูลสองครั้งดังนั้นฉันจึงเขียนไฟล์ลงในไฟล์บันทึกเมื่อใดก็ตามที่มีแหล่งที่มาและน่าประหลาดใจที่มีการบันทึกเพียงหนึ่งรายการ ยิ่งน่าแปลกใจคือความจริงที่ว่าเมื่อผมแสดงความคิดเห็นออกรายการที่อยู่ใน~/.profileรายการยังคงปรากฏในPATHตัวแปร สิ่งนี้ทำให้ฉันมีข้อสรุปสามประการซึ่งหนึ่งในนั้นถูกตัดออกอย่างรวดเร็ว:

  1. Bash ละเว้นความคิดเห็น bash ที่ถูกต้องและยังคงดำเนินการรหัสความคิดเห็น
  2. มีสคริปต์ที่อ่าน~/.profileและไม่สนใจรหัสใด ๆ ที่พิมพ์เอาต์พุต (ตัวอย่างเช่นล็อกไฟล์)
  3. มีอีกฉบับหนึ่งของฉัน~/.profileที่กำลังถูกหาที่อื่น

อันแรกฉันสรุปได้อย่างรวดเร็วว่าไม่ใช่เพราะการทดสอบที่รวดเร็ว ตัวเลือกที่สองและสามเป็นสิ่งที่ฉันต้องการความช่วยเหลือ

ฉันจะรวบรวมบันทึกสคริปต์ที่ดำเนินการได้อย่างไรเมื่อเทอร์มินัลเริ่มทำงาน ฉันใช้echoในไฟล์ที่ฉันตรวจสอบเพื่อทราบว่าไฟล์เหล่านั้นมาจากการทุบตีหรือไม่ แต่ฉันต้องหาวิธีการสรุปที่ติดตามการดำเนินการถึงจุดเมื่อเทอร์มินัลพร้อมให้ฉันเริ่มพิมพ์มัน

ถ้าข้างต้นเป็นไปไม่ได้แล้วทุกคนสามารถแนะนำที่อื่นฉันสามารถมองเพื่อดูว่าสคริปต์จะถูกเรียกใช้


การอ้างอิงในอนาคต

นี่คือสคริปต์ที่ฉันใช้ในการเพิ่มเส้นทางของฉัน:

function add_to_path() {
    for path in ${2//:/ }; do
        if ! [[ "${!1}" =~ "${path%/}" ]]; then # ignore last /
            new_path="$path:${!1#:}"
            export "$1"="${new_path%:}" # remove trailing :
        fi
    done
}

ฉันใช้มันแบบนี้:

add_to_path 'PATH' "/some/path/bin"

สคริปต์ตรวจสอบว่าเส้นทางมีอยู่แล้วในตัวแปรก่อนที่จะเตรียมมัน

สำหรับผู้ใช้ zsh คุณสามารถใช้สิ่งนี้ได้:

function add_to_path() {
    for p in ${(s.:.)2}; do
        if [[ ! "${(P)1}" =~ "${p%/}" ]]; then
            new_path="$p:${(P)1#:}"
            export "$1"="${new_path%:}"
        fi
    done
}

แก้ไข 28/8/2018

อีกสิ่งหนึ่งที่ฉันพบว่าฉันสามารถทำได้กับสคริปต์นี้คือการแก้ไขเส้นทางด้วย ดังนั้นเมื่อเริ่มต้น.bashrcไฟล์ของฉันฉันจะทำสิ่งนี้:

_temp_path="$PATH"
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin'
add_to_path 'PATH' "$_temp_path"
unset _temp_path

มันขึ้นอยู่กับคุณว่าPATHควรเริ่มต้นด้วยอะไร ตรวจสอบPATHก่อนตัดสินใจ


ทุบตีเพียงอ่านจาก~/.profile ถ้า~/.bash_profileไม่ได้อยู่ ...
jasonwryan

@jasonwryan ฉันมา~/.profileและ~/.bashrcจาก~/.bash_profile
smac89

คำตอบ:


30

หากระบบของคุณมีอยู่straceคุณสามารถแสดงรายการไฟล์ที่เปิดโดยเชลล์ตัวอย่างเช่นการใช้

echo exit | strace bash -li |& grep '^open'

( -liหมายถึงล็อกอินเชลล์แบบโต้ตอบใช้-iสำหรับเชลล์ที่ไม่ใช่การล็อกอินเท่านั้น)

นี่จะแสดงรายการไฟล์ที่เชลล์เปิดหรือพยายามเปิด ในระบบของฉันมีดังนี้:

  1. /etc/profile
  2. /etc/profile.d/*(สคริปต์ต่าง ๆ ใน/etc/profile.d/)
  3. /home/<username>/.bash_profile (สิ่งนี้ล้มเหลวฉันไม่มีไฟล์ดังกล่าว)
  4. /home/<username>/.bash_login (สิ่งนี้ล้มเหลวฉันไม่มีไฟล์ดังกล่าว)
  5. /home/<username>/.profile
  6. /home/<username>/.bashrc
  7. /home/<username>/.bash_history (ประวัติของบรรทัดคำสั่งนี่ไม่ใช่สคริปต์)
  8. /usr/share/bash-completion/bash_completion
  9. /etc/bash_completion.d/* (สคริปต์ต่าง ๆ ที่มีฟังก์ชั่นเติมข้อความอัตโนมัติ)
  10. /etc/inputrc (กำหนดการเชื่อมโยงคีย์นี่ไม่ใช่สคริปต์)

ใช้man straceสำหรับข้อมูลเพิ่มเติม


ขอบคุณสำหรับข้อมูลของคุณ แต่ฉันคิดว่ามีบางอย่างผิดปกติกับทุบตีของฉัน การรันecho $0ในเทอร์มินัลให้-bashมากกว่าที่คาดbashไว้ คุณมีข้อเสนอแนะอื่น ๆ สำหรับเรื่องนี้หรือไม่?
smac89

3
@ smac89: นั่นเป็นเรื่องปกติสำหรับเชลล์ล็อกอิน พฤติกรรมทุบตีเป็นเปลือกเข้าสู่ระบบเมื่อตัวละครที่ 1 $0เป็นเส้นประหรือเมื่อเรียกด้วยตัวเลือก- -l
AlexP

ตกลงนั่นเป็นบิตของการบรรเทา ฉันได้รันคำสั่งที่คุณให้และผลลัพธ์ดูซับซ้อนจริงๆ แต่อย่างไรก็ตามไฟล์ทั้งหมดที่แสดงไม่มีรายการที่ซ้ำกัน นี่ทำให้ฉันคิดว่ารายการที่ซ้ำกันเกิดขึ้นเมื่อฉันเข้าสู่บัญชีของฉันเป็นครั้งแรกนั่นคือมีบางสิ่งเริ่มต้นการจัดหารายการในไฟล์นั้นและจะทำอีกครั้งเมื่อฉันเปิดเทอร์มินัล อันที่จริงฉันคิดว่ามันอาจจะเป็น เมื่อฉันเข้าสู่บัญชีของฉันรายการนั้นมีที่มาและอีกครั้งเมื่อฉันเปิด terminal กระบวนการซ้ำแล้วซ้ำอีก เสียงนั้นเป็นไปได้หรือไม่?
smac89

ทำไมคุณไม่แก้จุดบกพร่องแบบเก่าโดยใส่echo PATH=\""$PATH"\"จุดเริ่มต้นและจุดสิ้นสุด.profileและ.bashrc? และทำไมคุณไม่ทำสิ่งที่ทุกคนไม่และกำหนดเส้นทางทั้งสองอย่างเต็มที่หรือหากเพิ่มไดเรกทอรีรักษา: echo ":$PATH:" | grep -q ":/path/to/dir:" || export PATH="$PATH:/path/to/dir"?
AlexP

4
ใช้sudo bash -c "echo exit|dtruss bash -li|& less|grep '^open'"กับ macOS (แทนที่straceด้วยdtruss)
Max Coplan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.