จะทดสอบความขัดแย้งที่อาจเกิดขึ้นขณะใช้นามแฝงใน bashrc อย่างไร


12

มีวิธีง่าย ๆ ในการแสดงรายการความขัดแย้งของคำสั่งทั้งหมดที่เกิดขึ้นในระบบเนื่องจากการอัพเดต bashrc ที่เกี่ยวข้องกับคำสั่ง alias หรือไม่?

ตัวอย่างเช่นมีคนเขียนเป็นalias ls=/path/to/user-generated/executablebashrc เราจะรู้ได้อย่างไรว่านี่เป็นการปกปิดคำสั่งจริง ( ls) วิธีหนึ่งดูเหมือนว่าจะเรียกใช้นามแฝงทั้งหมดก่อนและหลังการจัดหา bashrc และกระจายเอาต์พุต มีวิธีที่ดีกว่านี้อีกไหม?

ฉันใช้ Ubuntu 12.04

ทุบตี - รุ่น

GNU ทุบตีรุ่น 4.2.24 (1) - ปล่อย (i686-pc-linux-gnu)


โดยทั่วไปแล้วคนที่ตอบรับจะมีประโยชน์มากกว่าถ้าคุณระบุเวอร์ชันของ bash แทนที่จะเป็นเวอร์ชัน OS เมื่อถามคำถามเฉพาะเกี่ยวกับ bash
จอร์แดน

@jordanm อัปเดตแล้ว
user13107

คำตอบ:


8

ในการค้นหาว่าคำสั่งใดถูกปิดบังโดยนามแฝงให้ทำดังนี้:

alias | sed 's/^[^ ]* *\|=.*$//g' | while read a; do
  printf "%20.20s : %s\n" $a "$(type -ta $a | tr '\n' ' ')"
done | awk -F: '$2 ~ /file/'

คำอธิบาย

aliasแสดงรายการนามแฝงที่กำหนดไว้คนเดียวและsedแยกชื่อของพวกเขา ขณะที่ลูปรันtype -taบนแต่ละรายการและawkพิมพ์บรรทัดที่ทั้งคู่มีชื่อแทนและไฟล์


15

คุณสามารถใช้typeเพื่อค้นหาวิธีตีความคำสั่งโดย bash


ตัวอย่างเช่นtype lsพิมพ์ls is aliased to `ls --color=auto'ที่นี่
l0b0

Same ทำงานกับwhichแต่ตอนนี้ฉันไม่ถ้าทั้งสองชนิด (ชนิดใด) shell buildins เหมือนกัน
คณิตศาสตร์

@ แม ธ : type whichบอกกับคุณwhich is /usr/bin/whichดังนั้นมันจึงไม่ใช่แบบบิลท์อิน ดังนั้นจึงไม่สามารถบอกคุณได้ว่ามีบางสิ่งในตัวหรือไม่ (เช่นwhich echoเมื่อเทียบกับtype echo)
choroba

ฉันเดาว่ามันขึ้นอยู่กับเชลล์ที่คุณใช้: type which which is a shell builtinฉันใช้ zsh
คณิตศาสตร์

@math: คำถามเดิมถูกติดแท็ก / bash
choroba

7

ตามคำถามแรกของคุณไม่มีรายการความขัดแย้งเนื่องจากทุบตีใช้ตารางแฮชภายในจะบันทึกเฉพาะการแทนที่ครั้งล่าสุดเท่านั้น

หากต้องการทราบว่าคำสั่งเป็นนามแฝงหรือไม่ให้ใช้alias lsในกรณีของคุณหากคำสั่งนั้นบอกคุณบางอย่างเช่น "ไม่พบ" แสดงว่าไม่ใช่นามแฝงมิฉะนั้นจะเป็นเช่นนั้น

ในการเริ่มต้นฟังก์ชั่นดั้งเดิมโดยไม่คำนึงถึง alias ให้ใส่เครื่องหมายทับหน้าเช่น\lsจะเปิด ls hashed จริงให้ละเว้นชื่อแทน

แก้ไข

หากคุณต้องการทราบอย่างรวดเร็วหากคำสั่งเป็นนามแฝงคุณสามารถเปิดใช้งานโหมดแก้ไขข้อบกพร่องได้set -xในตอนนี้หากคุณดำเนินการls:

ป้อนคำอธิบายรูปภาพที่นี่

คุณจะเห็นผลลัพธ์การดีบักของคำสั่งจริงที่กำลังดำเนินการ

หากต้องการยกเลิกโหมด debug ให้ใช้ set -


ขอบคุณ แต่ไม่ได้รับaliasส่วนหนึ่ง เกิดอะไรขึ้นถ้าผู้ใช้ไม่ทราบว่ามีคำสั่งอยู่ (เช่นls)? สิ่งเดียวที่เขาดูเหมือนจะรู้หลังจากทำงานalias lsคือสิ่งที่มันถูกแมปและไม่ใช่สิ่งที่มันถูกแมปด้วย ฉันเดาว่าจะต้องเรียกใช้คำสั่งทั้งหมดด้วยและไม่มี \ เพื่อค้นหาความขัดแย้ง
user13107

@ user13107 อัปเดตคำตอบแล้ว
daisy

ขอบคุณ ฉันจะยกเลิกการติดตามได้อย่างไร
user13107

@ user13107 อัปเดตอีกครั้ง ;-P
daisy

1
"ไม่มีทางที่จะแสดงรายการความขัดแย้ง" - คุณแค่จินตนาการไม่พอ
camh

6

คุณสามารถใช้ builtin ทุบตีที่จะได้รับรายชื่อของคำสั่งและชื่อแทนทั้งหมดที่ใช้compgen compgen -acคำสั่งใด ๆ compgen -acที่ยังเป็นนามแฝงจะซ้ำในรายการนี้เพื่อให้การแก้ปัญหาไร้เดียงสาที่เรียบง่ายคือการมองหาที่ซ้ำกันในการส่งออกของ

อย่างไรก็ตามรายการที่ซ้ำกันอาจปรากฏขึ้นหากคำสั่งอยู่บนเส้นทางสองครั้ง ยกตัวอย่างเช่นผมมี/bin/whichและ/usr/bin/whichเพื่อcompgen -acจะแสดงรายการwhichเป็นครั้งที่สองแม้ว่ามันจะไม่ได้เป็นนามแฝง

ดังนั้นสิ่งที่จำเป็นคือการได้รับสิ่งที่ซ้ำกันทั้งหมดcompgen -acและเปรียบเทียบกับรายการของนามแฝง เฉพาะรายการที่เป็นชื่อแทนเท่านั้นคือชื่อแทนเหล่านั้นที่ซ่อนคำสั่ง เราสามารถทำได้ด้วยcomm(1)คำสั่งและด้วยการทดแทนกระบวนการทุบตี

comm -12 <(compgen -a | sort) <(compgen -ac | sort | uniq -d) 

compgen -a | sortคือรายการของนามแฝงทั้งหมด (เรียงลำดับcomm) compgen -ac | sort | uniq -dคือรายการที่ซ้ำกันทั้งหมดจากรายการคำสั่งและนามแฝง comm -12เอาต์พุตเฉพาะบรรทัดเหล่านั้นที่ใช้ร่วมกันกับทั้งคู่


5

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

bash -x -l -i -c 'exit' 2>&1 | grep ' alias '
  • -x -> เปิดใช้งานการแก้ไขข้อบกพร่อง
  • -l -> เปลือกเข้าสู่ระบบ
  • -i -> เปลือกโต้ตอบ
  • -c -> คำสั่ง

การรันคำสั่ง exit จำเป็นต้องมีเพื่อให้เชลล์ส่งคืน -iเป็นสิ่งจำเป็นในกรณีนี้เพราะทุบตีจะไม่ได้ตั้งค่าสภาพแวดล้อมการโต้ตอบเพื่อเรียกใช้คำสั่งเป็นอย่างอื่น

นี่คือตัวอย่างจากระบบของฉัน:

$ bash -x -l -i -c 'exit' 2>&1 | grep ' alias '
++ alias 'ls=ls --color=auto'
$ alias -p
alias ls='ls --color=auto'

เพื่อดูว่าไฟล์ใดถูกแหล่งข้อมูลล่าสุดเมื่อกำหนดนามแฝงเพื่อกำหนดไฟล์ที่เกิดขึ้นคุณสามารถขยาย grep:

bash -x -l -i -c 'exit' 2>&1 | grep -E ' (alias|[.]|source) '

สิ่งนี้อาจส่งคืนผลบวกปลอม แต่ควรใช้ได้ถ้าคุณตรวจสอบข้อมูลที่ส่งคืนด้วยตนเอง จำนวนของสัญลักษณ์ '+' ด้านหน้าคำสั่งที่ดำเนินการจะระบุความลึก

+ . /home/jordan/.bashrc
++ alias 'ls=ls --color=auto'
++ . /home/jordan/.foo
+++ alias t=test
++ alias t=test2

ในการส่งออกตัวอย่างนี้แสดงให้เห็นว่า .bashrc ชุดนามแฝงสำหรับlsนามแฝง .foo tแล้ว .bashrc tแทนที่นามแฝงก่อนหน้านี้


ขอบคุณ สิ่งนี้มีประโยชน์อย่างแน่นอน แต่ไม่สามารถดูว่ามันพบความขัดแย้งในการสร้างนามแฝงอย่างไร
user13107

@ user13107 ฉันได้เพิ่มรายละเอียดเพิ่มเติมที่น่าจะมีประโยชน์ การตั้งค่านามแฝงเป็นค่าใหม่ไม่ใช่นามแฝง "ที่ขัดแย้งกัน" เป็นพฤติกรรมที่บันทึกไว้ตามปกติซึ่งเป็นเหตุผลว่าทำไมจึงจำเป็นต้องมีวิธีการปัดเศษ
จอร์แดน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.