เป็นไปได้หรือไม่ที่จะตรวจสอบว่ามีการกำหนดนามแฝงหรือไม่?


24

นามแฝงเช่นllถูกกำหนดด้วยaliasคำสั่ง

ฉันสามารถตรวจสอบคำสั่งด้วยสิ่งต่าง ๆtype llที่พิมพ์ได้

ll is aliased to `ls -l --color=auto'

หรือcommand -v llที่พิมพ์

alias ll='ls -l --color=auto'

หรือalias llที่พิมพ์

alias ll='ls -l --color=auto'

แต่ฉันไม่สามารถหาตำแหน่งที่กำหนดนามแฝงได้เช่นไฟล์เช่น.bashrcหรืออาจด้วยตนเองในเชลล์ที่กำลังรัน ณ จุดนี้ฉันไม่แน่ใจว่าจะเป็นไปได้

ฉันควรผ่านไฟล์ทั้งหมดที่โหลดbashและตรวจสอบไฟล์ทุกไฟล์หรือไม่?


ปิดแขนเสื้อฉันจะบอกว่าวิ่งbash -xl
Jeff Schaller

คำตอบ:


21

นิยามแบบแมนนวลนั้นจะมองเห็นได้ยาก (บันทึกประวัติบางที) แม้ว่าจะขอให้เชลล์แสดงสิ่งที่กำลังทำอยู่และจากนั้นgrepควรช่วยค้นหาชุดที่อยู่ในไฟล์ rc:

bash -ixlc : 2>&1 | grep ...
zsh -ixc : 2>&1 | grep ...

หากเชลล์ไม่ได้จับตัวเลือกที่จำเป็นอย่างแม่นยำด้วยการเรียกใช้อย่างใดอย่างหนึ่งดังกล่าวข้างต้น (ที่เรียกใช้คำสั่ง null แบบโต้ตอบ) ดังนั้นscript:

script somethingtogrep thatstrangeshell -x
...
grep ... somethingtogrep

อีกตัวเลือกหนึ่งที่จะใช้สิ่งที่ชอบstraceหรือsysdigที่จะหาทุกไฟล์สัมผัสเปลือกแล้วไปgrepเหล่านั้นด้วยตนเอง (มีประโยชน์ถ้าเปลือกหรือโปรแกรมไม่ได้มี-xธง); ไฟล์ RC มาตรฐานไม่เพียงพอสำหรับการตรวจสอบชื่อไฟล์แบบแมนนวลหากสิ่งที่ต้องการเช่น oh-my-zsh หรือการกำหนดค่าเฉพาะไซต์กำลังดึงโค้ดจากผู้ที่รู้ว่าที่ไหน (หรืออาจมีตัวแปรสภาพแวดล้อมด้วยเช่นกัน .


ขอบคุณ! แม้ว่าเอาต์พุตจะยากในการแยกวิเคราะห์ แต่ฉันพบไฟล์ที่กำหนดนามแฝงที่ฉันค้นหา เมื่อนามแฝงไม่ปรากฏที่ใดก็ได้ในรายการนั้นจะปลอดภัยหรือไม่ที่จะสมมติว่ากำหนดนามแฝงด้วยตนเอง
polemon

@polemon ค่อนข้างปลอดภัย มันอาจจะเป็น (หรือถูก) กำหนดไว้ในไฟล์ที่ไม่ได้ถูกอ่านเพราะใครรู้อะไรเหตุผลหรือหรือถูกลบ (โดยเฉพาะอย่างยิ่งถ้ามีกรอบเชลล์บางประเภทเพิ่มความซับซ้อนที่ผู้ใช้ไม่ได้ เข้าใจ).
thrig

1
ในการทำให้จุดที่นามแฝงถูกกำหนดให้หาง่ายขึ้นคุณสามารถใช้ PS4 ซึ่งได้รับการต่อเติมทุกบรรทัดในการติดตาม:PS4='+The ll alias is "${BASH_ALIASES["ll"]}" ' bash -ixlc :
Mark Plotnick

5

ที่นี่ฉันพบว่าgrep -rlมีประโยชน์มาก:

grep -rl alias ~/.bash* ~/.profile /etc/profile /etc/bash.bashrc

จะบอกให้คุณทราบว่าไฟล์aliasนั้นใช้คำใด

อาจเป็น~/.bashrcและแน่นอนที่สุด~/.bash_aliasesถ้ามันมีอยู่


อย่างไรก็ตามเป็นไปไม่ได้ที่จะตรวจสอบให้แน่ใจว่าครอบคลุมตัวเลือกทั้งหมด ไฟล์เหล่านั้นอาจโทรหรือโหลดไฟล์อื่น ๆ ตัวแปรสภาพแวดล้อมเช่น ENV หรือ$BASH_ENVอาจเป็นการทุบตีโดยตรงเพื่อโหลดไฟล์อื่น ๆ

ค้นหาตัวแปร BASH_ENV ในสภาพแวดล้อมขยายค่าหากปรากฏขึ้นที่นั่นและใช้ค่าที่ขยายเป็นชื่อไฟล์เพื่ออ่านและดำเนินการ

และนามแฝงอาจถูกกำหนดโดยการตั้งค่าตัวแปร (เหมืองที่เน้น):

BASH_ALIASES
ตัวแปรอาเรย์แบบเชื่อมโยงซึ่งสมาชิกสอดคล้องกับรายชื่อนามแฝงภายในที่ได้รับการดูแลโดย alias builtin องค์ประกอบที่เพิ่มลงในอาร์เรย์นี้จะปรากฏในรายการนามแฝง


grep -rl alias ~/.bash*อาจจับคู่ไฟล์ประวัติเท็จ แต่ +1 สำหรับการชี้ให้เห็นอาร์เรย์ BASH_ALIASES!
Jeff Schaller

2

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

/etc/profile
~/.profile
/etc/bash.bashrc
~/.bash_profile
~/.bashrc

คุณควรจะสามารถ grep grep 'ls -l --color=auto' /etc/profile ~/.profile /etc/bash.bashrc ~/.bash_profile ~/.bashrcผ่านเหล่านั้นเพื่อหานามแฝงเช่น


หรือไฟล์จากที่นั่น ...
เจฟฟ์ชาลเลอร์

@JeffSchaller - ใช่แล้วคุณต้องการบางสิ่งที่ซับซ้อนกว่าสำหรับแบบbash -xนั้นดังที่คุณพูดถึง ฉันคิดว่าข้างต้นนั้นง่ายพอที่จะทำงานได้อย่างรวดเร็วและหากไม่พบนามแฝงที่คุณสามารถอ่านผ่านขั้นตอนการดำเนินการ
edaemon

1

เมื่อรวมคำตอบของ thrigกับคำแนะนำของ @ MarkPlotnickคุณสามารถทดสอบว่าBASH_ALIASES[ll]มีการตั้งค่าให้แคบลงหรือไม่ BASH_SOURCEอาร์เรย์และLINENOตัวแปรที่มีประโยชน์อย่างยิ่งที่นี่ น่าเสียดายที่การตรวจสอบว่าBASH_ALIASES[ll]มีการตั้งค่าจะประสบความสำเร็จหลังจากมีการตั้งชื่อแทนแล้วดังนั้นบรรทัดแรกนั้นอาจอยู่ในไฟล์อื่นทั้งหมด

PS4='${BASH_ALIASES["ll"]+"The ll alias has been defined before"} ${BASH_SOURCE}:$LINENO ' bash -lixc : |&
  grep 'll alias' -m1 -B1

ให้ผลลัพธ์เช่น:

   /home/muru/.bash_aliases:1 alias 'll=ls -AlhF'
TThe ll alias has been defined before /home/muru/.bashrc:116 alias 'ping=ping -c5'

คุณสามารถยกเลิกเชลล์โดยใช้การตรวจสอบนี้:

$ PS4='${BASH_ALIASES["ll"]+"$(kill -9 $$)"} ${BASH_SOURCE}:$LINENO ' bash -lixc : |& tail -n1
   /home/muru/.bash_aliases:1 alias 'll=ls -AlhF'

0

whichผมเคยประสบความสำเร็จเพียงแค่ใช้

[crclayton@pc scripts]$ which foo
foo:     aliased to python $HOME/projects/python/foo.py

1
whichสามารถจัดการนามแฝงใน tcsh (และอาจก่อนหน้านี้ csh) และ zsh ที่มันเป็น builtin และในทุบตีใช้โปรไฟล์เริ่มต้นในครอบครัว RedHat ซึ่งมี kludge เพื่อเรียกใช้โปรแกรม (ภายนอก) GNU แต่ฟีดมันเปลือกข้อมูลนามแฝงไม่เช่นนั้น . ที่สำคัญกว่านั้นจะบอกว่านามแฝงถูกตั้งค่าไว้ที่ใดไม่ใช่ตั้งไว้ที่ไหนซึ่งเป็น Q ที่นี่
dave_thompson_085


-1

ในที่สุดฉันก็พบllคำนิยามนามแฝงสำหรับเว็บเซิร์ฟเวอร์ของเรา (CentOS) ในสองเชลล์สคริปต์ใน/etc/profile.d/:

  • /etc/profile.d/colorls.csh
  • /etc/profile.d/colorls.sh

ฉันพบมันโดยการเรียนรู้ครั้งแรกจากความคิดเห็นข้างต้นว่าโปรไฟล์ของทั้งระบบเป็นอย่างไร: /etc/profile. ไฟล์นั้นระบุว่ามีการกำหนดนามแฝงทั้งระบบ/etc/bashrcและในไฟล์นั้นฉันเห็นว่ามันวนซ้ำหลาย ๆ เชลล์สคริปต์/etc/profile.d/ดังนั้นฉันจึงใช้grepในไดเรกทอรีนั้นและในที่สุดก็พบคำจำกัดความ ฉันยังค้นพบว่ามีl.นามแฝงซึ่งแสดงรายการไฟล์ dot ทั้งหมด:

จากcolorls.sh:

alias ll='ls -l --color=auto' 2>/dev/null
alias l.='ls -d .* --color=auto' 2>/dev/null
alias ls='ls --color=auto' 2>/dev/null

(มีชื่อแทนที่เทียบเท่าcolorls.cshกัน)


-1

ใช้คำสั่งต่อไปนี้ก่อน

รายการฟังก์ชั่นทั้งหมด

functions 

รายการนามแฝงทั้งหมด

alias 

หากคุณไม่พบนามแฝงหรือฟังก์ชันให้พิจารณาวิธีการค้นหาที่เข้มงวดยิ่งขึ้น

รุ่นทุบตี

bash -ixlc : 2>&1 | grep thingToSearchHere

รุ่น Zsh

zsh -ixc : 2>&1 | grep thingToSearchHere

คำอธิบายสั้น ๆ ของตัวเลือก

-i     Force shell to be interactive.

-c     Take the first argument as a command to execute

-x      -- equivalent to --xtrace

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