我可以在bash
将列出所有可识别命令的外壳程序(恰好是)上键入什么?
另外,这在外壳方面是否有所不同?还是所有的shell都只有它们识别的命令的“目录”?
其次,另一个问题,但是我该如何覆盖那些问题呢?换句话说,我该如何编写自己的view
命令来替换Ubuntu系统上现有的命令,该命令似乎只是在加载vim
。
我可以在bash
将列出所有可识别命令的外壳程序(恰好是)上键入什么?
另外,这在外壳方面是否有所不同?还是所有的shell都只有它们识别的命令的“目录”?
其次,另一个问题,但是我该如何覆盖那些问题呢?换句话说,我该如何编写自己的view
命令来替换Ubuntu系统上现有的命令,该命令似乎只是在加载vim
。
Answers:
您可以使用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.
compgen -c
将包括诸如此类{
或while
严格说来不是命令的东西。
Shell知道四种命令。
~/.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
特定类型的list命令。您可以传递一个附加字符串以compgen
仅列出以该前缀开头的命令。
在zsh中,你可以列出一个给定类型的当前可用的命令echo ${(k)aliases}
,echo ${(k)functions}
,echo ${(k)builtins}
和echo ${(k)commands}
(即最后一个仅列出外部命令)。
以下与shell无关的代码段列出了所有可用的外部程序:
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参考手册说:
仅当在哈希表中找不到命令时,才对$ 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。
$PATH
like /bin:/usr/bin:
(trailing :
)的值,它将无法在当前目录中列出可执行文件。
命令列表由两部分组成:
PATH
您无法更改内置插件,但是可以通过指定完整的路径名(例如)来防止外壳程序使用内置插件/bin/echo
。
至于中的命令PATH
,您可以更改它。 PATH
是一个用冒号分隔的目录列表,用于在其中查找命令。找到的第一个匹配文件为“ wins”。
export PATH=~/bin:${PATH}
(此语法不适用于csh
衍生的shell,但不适用于我所知道的所有其他语法)。
导出时将PATH
其~/bin
作为第一个条目,然后是其余的现有PATH
条目。因此,现在您的外壳将检查directory called
bin in your home directory for a command *first* before checking the standard
PATH`系统设置。您可以使用以下方法轻松地使其最后检查新目录:
export PATH=${PATH}:~/bin
要PATH
保留以后的登录名,请将其添加到.profile
或其他Shell rc文件中。
使用bash尝试一下:
printf '%s\n' ${PATH//:/\/* }
如果按Tab键两次,然后按y,您将获得当前Shell中所有可用命令的列表。对于第二个问题,我认为您应该使用alias:shell alias。