通过/bin/sh可执行的命令有哪些?为何管道传入cd命令不生效
为什么echo "cd .." | /bin/sh执行无效果
每个Linux进程都拥有独立的工作目录属性,你通过管道将命令传给/bin/sh时,系统会启动一个全新的独立sh子进程来执行传入的命令:
cd是shell内置命令,作用是修改当前运行它的shell进程的工作目录,你传入的cd ..只会修改这个临时启动的sh子进程的工作目录,子进程执行完命令后会直接退出,完全不会影响你当前正在操作的父shell的工作目录- 你之前测试的
echo、pwd、cat都属于仅产生标准输出、不会修改shell自身状态的命令,所以即使在子进程运行,你也能看到输出,感知不到子进程和父进程的差异 - 可以执行
echo "cd .. && pwd" | /bin/sh验证,输出结果会是/root,说明cd在子进程中实际已经生效,只是没有同步到父shell,且cd默认没有输出所以你看不到反馈
/bin/sh可执行的命令范围
不存在固定的“完整命令列表”,只要符合以下两类规则的命令都可以被/bin/sh执行:
- Shell内置命令:是
/bin/sh自身集成实现的命令,不需要调用外部二进制文件,常见的包括cd、echo、pwd、export、unset、alias等,不同系统的/bin/sh实现(比如部分系统默认是dash、部分是bash兼容模式)内置命令列表略有差异,你可以进入sh环境后执行compgen -b查看当前/bin/sh的所有内置命令 - 外部可执行程序/脚本:只要文件具备可执行权限,且文件路径在
/bin/sh的PATH环境变量覆盖的范围内(或者写完整绝对路径),都可以被执行,比如cat、ls、grep这类常见的系统工具都属于外部命令
内容的提问来源于stack exchange,提问作者NoahVerner
相关产品推荐
相关产品推荐

