【发布时间】:2014-04-02 23:24:01
【问题描述】:
我了解,由于| 为管道之后 的命令启动了一个新进程,因此cmd | cd newdir 形式的任何shell 命令(其中cmd 不会更改当前工作目录)将保持原始进程的工作目录不变。 (更不用说这有点傻,因为cd 不从标准输入读取输入。)
但是,在我的机器上(CentOS 6 机器,使用bash、ksh 或zsh),似乎以下命令也无法更改目录: p>
cd newdir | cat
(请忽略在这里将输出通过管道传输到 cat 是多么愚蠢;我只是想举一个简单的例子。)
这是为什么?有没有办法解决这个问题?具体来说,我正在尝试编写一个使用 popd 但捕获输出、丢弃标准输出并重新输出标准错误的别名。
(出于好奇,这是我当前的非工作别名:popd 2>&1 >/dev/null | toerr && lsd。这里,toerr 只是捕获标准输入,将其输出到标准错误,并返回读取/打印的行数。lsd 是一个目录名称和内容打印机,只有在popd成功时才应该执行。我将stderr发送到stdout、管道它、捕获它并在stderr上重新输出的原因只是为了让它着色红色使用stderred,因为我的shell会话没有加载LD_PRELOAD,所以像popd这样的Bash内置函数不会得到红色的stderr。)
【问题讨论】:
-
回应谁投票决定关闭它,因为它是题外话:首先,这个问题既适用于 shell 脚本,也适用于交互式 shell 会话;其次,问题出现在编写别名的上下文中,别名(尤其是在这种情况下,涉及到一些相对复杂的逻辑)本质上是一个小程序;
-
第三,关于 SuperUser 上的进程和子进程的主题问题倾向于更多地关注用户与正在运行的进程的交互(查看/杀死作业、生成进程等),而这个问题涉及技术行为
|,这对我来说更像是一个编程问题。
标签: shell unix process pipe cd