
bash
인식되는 모든 명령을 나열하는 쉘( )에 무엇을 입력할 수 있습니까 ?
또한 이것은 쉘마다 다른가요? 아니면 모든 쉘에는 인식할 수 있는 명령의 "디렉토리"만 있습니까?
둘째, 다른 질문입니다. 그러나 그 중 하나를 어떻게 무시할 수 있습니까? 즉, view
방금 로드된 것처럼 보이는 Ubuntu 시스템에 존재하는 명령을 대체하기 위해 내 명령을 어떻게 작성할 수 있습니까 vim
?
답변1
당신이 사용할 수있는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.
답변2
쉘은 네 가지 종류의 명령을 알고 있습니다.
- 별칭: 일부 옵션이 포함된 명령의 별명입니다. 이는 쉘의 초기화 파일(
~/.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에는 해시된 명령이라는 극단적인 경우가 있습니다.
배쉬 참조 매뉴얼말한다:
해시 테이블에서 명령을 찾을 수 없는 경우에만 $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를 준수하지 않습니다.
답변3
이것을 사용해보십시오.세게 때리다:
( # usage of a sub processus: the modificaion of PATH variable is local in ( )
PATH+=:EOF # little hack to list last PATH dir
printf '%s\n' ${PATH//:/\/* }
)
답변4
Tab 키를 두 번 누른 다음 y를 누르면 현재 셸에서 사용 가능한 모든 명령 목록이 표시됩니다. 두 번째 질문에는 별칭을 사용해야 한다고 생각합니다.쉘 별칭.