Có thể kiểm tra nơi một bí danh đã được xác định?


24

Một bí danh, chẳng hạn như llđược xác định với aliaslệnh.

Tôi có thể kiểm tra lệnh với những thứ như type llbản in

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

hoặc command -v llin

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

hoặc alias llcũng in

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

nhưng dường như tôi không thể tìm thấy nơi bí danh được xác định, tức là một tệp như .bashrc, hoặc có lẽ là thủ công trong trình bao chạy. Tại thời điểm này tôi không chắc chắn nếu điều này thậm chí có thể.

Tôi có nên đơn giản đi qua tất cả các tệp được tải bởi bashvà kiểm tra từng tệp trong số chúng không?


Tắt còng tôi muốn chạybash -xl
Jeff Schaller

Câu trả lời:


21

Định nghĩa thủ công sẽ khó phát hiện (có thể ghi nhật ký lịch sử) mặc dù yêu cầu shell hiển thị những gì nó đang làm và sau đó grepsẽ giúp tìm các tập hợp trong tệp RC:

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

Nếu shell không nắm bắt chính xác các tùy chọn cần thiết với một trong các lệnh trên (tương tác chạy lệnh null), thì script:

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

Một tùy chọn khác là sử dụng một cái gì đó như stracehoặc sysdigtìm tất cả các tệp mà shell chạm vào, sau đó chuyển grepchúng theo cách thủ công (tiện dụng nếu shell hoặc chương trình không có -xcờ); các tệp RC tiêu chuẩn không đủ để kiểm tra tên tệp thủ công nếu một cái gì đó như cấu hình oh-my-zsh hoặc trang web cụ thể đang lấy mã từ ai biết nơi nào (hoặc cũng có thể có các biến môi trường, như sorontar chỉ ra trong câu trả lời của họ) .


Cảm ơn! Mặc dù đầu ra hơi khó phân tích, nhưng tôi đã tìm thấy tệp xác định bí danh mà tôi đang tìm kiếm. Khi bí danh không có mặt ở bất cứ đâu trong danh sách đó, liệu có an toàn khi giả định bí danh được xác định thủ công không?
Polemon

@polemon có phần an toàn; nó có thể được xác định (hoặc đã được) xác định trong một tệp không được đọc vì ai biết lý do hoặc lý do đã bị xóa (đặc biệt là nếu có một loại khung vỏ nào đó thêm phức tạp mà người dùng không hiểu không).
thrig

1
Để làm cho điểm mà bí danh được xác định dễ tìm hơn một chút, bạn có thể sử dụng PS4, được đặt trước cho mỗi dòng trong một dấu vết:PS4='+The ll alias is "${BASH_ALIASES["ll"]}" ' bash -ixlc :
Mark Plotnick

5

Đây là nơi tôi thấy grep -rlrất hữu ích:

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

sẽ cho bạn biết tập tin nào aliasđược sử dụng.

Có lẽ trong ~/.bashrcvà chắc chắn nhất trong ~/.bash_aliasesnếu nó tồn tại.


Tuy nhiên, không thể chắc chắn rằng nó bao gồm tất cả các tùy chọn. Những tệp này cũng có thể gọi hoặc tải bất kỳ tệp nào khác. Một biến môi trường như ENV hoặc $BASH_ENVcó thể trực tiếp bash để tải một số tệp khác.

tìm kiếm biến BASH_ENV trong môi trường, mở rộng giá trị của nó nếu nó xuất hiện ở đó và sử dụng giá trị mở rộng làm tên của một tệp để đọc và thực thi.

Và bí danh thậm chí có thể được xác định bằng cách đặt một biến (nhấn mạnh của tôi):

BASH_ALIASES
Một biến mảng kết hợp có các thành viên tương ứng với danh sách bí danh bên trong được duy trì bởi các bí danh dựng sẵn. Các phần tử được thêm vào mảng này xuất hiện trong danh sách bí danh


grep -rl alias ~/.bash*có thể sai khớp các tệp lịch sử, nhưng +1 để chỉ ra mảng BASH_ALIASES!
Jeff Schaller

2

Tôi không biết cách nào để thực sự liệt kê nguồn bí danh của bạn, nhưng vì có vẻ như bạn đang sử dụng bash, tôi nghĩ đây là những tệp nguồn có thể:

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

Bạn sẽ có thể grep qua những cái đó để tìm bí danh, ví dụ grep 'ls -l --color=auto' /etc/profile ~/.profile /etc/bash.bashrc ~/.bash_profile ~/.bashrc.


Hoặc các tập tin được bao gồm từ đó ...
Jeff Schaller

@JeffSchaller - Phải, bạn cần một cái gì đó phức tạp hơn như thế bash -x, như bạn đã đề cập. Tôi cho rằng ở trên đủ dễ để chạy nhanh và nếu nó không tìm thấy bí danh bạn có thể đọc qua các bước thực hiện.
edaemon

1

Kết hợp câu trả lời thrig của với @ đề nghị MarkPlotnick của , bạn có thể kiểm tra xem BASH_ALIASES[ll]được thiết lập để thu hẹp nó xuống. Các BASH_SOURCEmảng và LINENOcác biến đặc biệt hữu ích ở đây. Thật không may, kiểm tra xem có BASH_ALIASES[ll]được đặt hay không sẽ chỉ thành công sau khi bí danh đã được đặt, và do đó, dòng đầu tiên như vậy có thể nằm trong một tệp khác hoàn toàn.

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

Cho đầu ra như:

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

Bạn thậm chí có thể chấm dứt shell bằng kiểm tra này:

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

0

Tôi đã thành công chỉ đơn giản là sử dụng which.

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

1
whichcó thể xử lý các bí danh trong tcsh (và có thể là csh trước đó) và zsh nơi nó là một phần tử dựng sẵn và trong bash bằng cách sử dụng cấu hình mặc định trên gia đình RedHat có chương trình GNU để chạy chương trình GNU (bên ngoài) . Quan trọng hơn, nó chỉ cho biết những gì bí danh được đặt thành, không phải nơi nó được đặt, đó là Q ở đây.
dave_thndry_085


-1

Cuối cùng tôi đã tìm thấy llđịnh nghĩa bí danh cho máy chủ web của chúng tôi (CentOS) trong hai tập lệnh shell trong /etc/profile.d/:

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

Tôi đã tìm thấy nó bằng cách học hỏi đầu tiên từ các ý kiến ​​trên, nơi hồ sơ toàn hệ thống là : /etc/profile. Tệp đó nói rằng các bí danh trên toàn hệ thống được định nghĩa /etc/bashrcvà trong tệp đó tôi thấy rằng nó lặp qua một số tập lệnh shell /etc/profile.d/, và vì vậy tôi đã sử dụng greptrong thư mục đó và cuối cùng đã tìm thấy các định nghĩa. Tôi cũng phát hiện ra một l.bí danh liệt kê tất cả các tệp chấm:

Từ 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

(Có các bí danh tương đương trong colorls.csh.)


-1

Đầu tiên sử dụng các lệnh sau

Liệt kê tất cả các chức năng

functions 

Liệt kê tất cả các bí danh

alias 

Nếu bạn không tìm thấy bí danh hoặc hàm, hãy xem xét một phương pháp tìm kiếm tích cực hơn

Phiên bản Bash

bash -ixlc : 2>&1 | grep thingToSearchHere

Phiên bản Zsh

zsh -ixc : 2>&1 | grep thingToSearchHere

Giải thích ngắn gọn về các lựa chọn

-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
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.