쉘이 알고있는 모든 명령을 나열하십시오.


32

bash인식되는 모든 명령을 나열 하는 쉘에서 무엇을 입력 할 수 있습니까?

또한 이것은 쉘마다 다른가요? 아니면 모든 셸에 인식하는 명령의 "디렉토리"가 있습니까?

둘째, 다른 질문이지만 어떻게 그중 하나를 무시할 수 있습니까? 다시 말해서 어떻게 view우분투 시스템에 존재하는 명령을 대체하기 위해 내 명령을 작성할 수 있습니까 vim?


5
질문을 결합하지 마십시오. 각 질문을 별도의 질문으로 게시하십시오.
terdon

unix.stackexchange.com/q/63073/135943 ( 거의 두 방향으로 연결) 의 거의 중복 .
Wildcard

답변:


61

당신이 사용할 수있는compgen

compgen -c # will list all the commands you could run.

참고 사항 :

compgen -a # will list all the aliases you could run.
compgen -b # will list all the built-ins you could run.
compgen -k # will list all the keywords you could run.
compgen -A function # will list all the functions you could run.
compgen -A function -abck # will list all the above in one go.

4
compgen -c같은 것들을 포함 {또는 while엄격하게 명령을 말할 수 없습니다.
Stéphane Chazelas

13

쉘은 4 가지 종류의 명령을 알고 있습니다.

  • 별명 : 일부 옵션이있는 명령의 별명입니다. 그것들은 쉘의 초기화 파일 (~/.bashrc bash 용)에 있습니다.
  • 함수 : 이름이 지정된 쉘 코드의 스 니펫입니다. 별명과 마찬가지로 별명은 쉘의 초기화 파일에 정의됩니다.
  • 내장 : 셸에는 적은 수의 내장 명령이 제공됩니다. 대부분의 내장은 쉘 상태를 조작합니다 ( cd현재 디렉토리, set옵션 및 위치 매개 변수 변경,export 변경, 환경 변경 등). 대부분의 쉘은 대체로 동일한 내장을 제공하지만 각 쉘에는 기본 세트에 대한 몇 가지 확장이 있습니다.
  • 외부 명령 : 쉘과 독립적입니다. 다른 프로그램과 마찬가지로 셸은 실행 가능한 검색 경로 에서 외부 프로그램을 찾아 외부 프로그램을 실행합니다 . PATH환경 변수는 프로그램을 검색 할 디렉토리를 콜론으로 구분 된 목록이 포함되어 있습니다.

동일한 이름으로 여러 유형의 명령이있는 경우 위 순서의 첫 번째 일치가 실행됩니다 ¹.

를 실행하면 이름에 해당하는 명령 유형을 확인할 수 있습니다 type some_name.

alias내장 인수를 인수없이 실행하여 별명을 나열 할 수 있습니다 . 모든 쉘에서 작동하는 함수 나 내장을 나열 할 수있는 방법이 없습니다. 쉘 문서에서 내장 목록을 찾을 수 있습니다.

bash에서 set내장 함수는 변수뿐만 아니라 해당 정의와 함께 함수를 나열합니다. bash에서 ksh 또는 zsh typeset -f는 함수를 정의와 함께 나열합니다. bash에서는 모든 유형의 모든 명령 이름을로 표시 할 수 있습니다 compgen -c. 당신은 사용할 수 있습니다 compgen -A alias, compgen -A builtin compgen -A function특정 유형의 목록 명령에. 추가 문자열을 전달하여 compgen해당 접두사로 시작하는 명령 만 나열 할 수 있습니다 .

zsh을, 당신은 지정된 유형의 현재 사용할 수있는 명령으로 나열 할 수 있습니다 echo ${(k)aliases}, echo ${(k)functions}, echo ${(k)builtins}echo ${(k)commands} (그 마지막 목록 외부 명령 만 해당).

다음의 쉘 불가지론 스 니펫은 사용 가능한 모든 외부 프로그램을 나열합니다.

case "$PATH" in
  (*[!:]:) PATH="$PATH:" ;;
esac

set -f; IFS=:
for dir in $PATH; do
  set +f
  [ -z "$dir" ] && dir="."
  for file in "$dir"/*; do
    if [ -x "$file" ] && ! [ -d "$file" ]; then
      printf '%s = %s\n' "${file##*/}" "$file"
    fi
  done
done

Bash에는 해시 명령이 있습니다.

Bash Reference Manual 은 다음과 같이 말합니다.

해시 테이블에서 명령을 찾을 수없는 경우에만 $ PATH에서 디렉토리를 완전히 검색합니다.

시험:

set -h
mkdir ~/dir-for-wat-command
echo 'echo WAT!' >~/dir-for-wat-command/wat
chmod +x ~/dir-for-wat-command/wat
hash -p ~/dir-for-wat-command/wat wat
wat

PATH환경 변수를 포함하지 않는 ~/dir-for-wat-command, compgen -c표시되지 않습니다 wat,하지만 당신은 실행할 수 있습니다 wat.

기존 명령을 숨기려면 별명 또는 함수를 정의하십시오 .

¹ 예외 : 일부 내장 ( 특수 내장 이라고 함 )은 함수로 음영 처리 할 수 ​​없습니다. bash 및 zsh는 기본 모드에서 POSIX를 준수하지 않습니다.


또 다른 에지 케이스는 $PATHlike /bin:/usr/bin:(trailing :) 값이며 , 현재 디렉토리에 실행 파일을 나열하지 못합니다.
Stéphane Chazelas

3

명령 목록은 두 세트로 구성됩니다.

  1. 쉘에 내장 된 명령
  2. 당신의 명령 PATH

내장을 변경할 수는 없지만 같은 전체 경로 이름을 지정하여 쉘이 내장을 사용하지 못하게 할 수 있습니다 /bin/echo.

당신의 명령에 관해서는 PATH, 당신은 할 수 그것을 변경할 수 있습니다. PATH명령을 찾을 콜론으로 구분 된 디렉토리 목록입니다. 첫 번째로 일치하는 파일은 "wins"입니다.

export PATH=~/bin:${PATH}

(이 구문은 csh파생 된 쉘에는 적용되지 않지만 내가 아는 다른 모든 쉘 에는 적용되지 않습니다 ).

즉, 수출 PATH~/bin첫 번째 항목은 기존의 나머지 다음과 같이 PATH항목. 이제 쉘은 시스템이 설정 한 directory calledbin in your home directory for a command *first* before checking the standardPATH 를 확인 합니다. 대신 다음을 사용하여 새 디렉토리를 마지막으로 쉽게 확인할 수 있습니다.

export PATH=${PATH}:~/bin

PATH향후 로그인을 유지 하려면 .profile다른 셸 rc 파일에 추가 하십시오.



1

tab 키를 두 번 누른 다음 y를 누르면 현재 쉘에서 사용 가능한 모든 명령 목록이 표시됩니다. 두 번째 질문에서는 alias : shell alias 를 사용해야한다고 생각합니다 .


별명과 관련하여 명령이 시스템의 어느 곳에서나 호출 될 때 (예 : 셸 스크립트에서) 명령을 재정의하고 재정의하지 않는 방법 ( "별칭 제거")입니까?
Themirror

1
어떤 껍질을 사용하십니까? 내 배쉬의 모든 명령을 나열하는 이중 탭을 얻을 수 없습니다.
terdon

우분투 13.04에서 bash를 사용합니다. bash에서 사용 가능한 모든 명령 목록을 가져 오는 데 사용할 수있는 compgen 명령도 있습니다.
coffeMug

@terdon bash 완료가 설치되어 있습니까?
coffeMug

1
show-all-if-ambiguous off
coffeMug
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.