linux - 获取屏幕输出行作为命令的参数

标签 linux bash unix command-line zsh

在 bash(或 zsh)中,有没有办法“回顾”之前的输出?

假设我有以下内容:

$ find . -depth 1 -name "d*"
dir1
dir2
dir3

$ cd [3rd line]

我可以在不重复上一个命令和使用管道的情况下从上一个输出中提取“dir3”吗?只是从屏幕上“捕获它”?

最佳答案

shell 根本看不到输出。当 find 运行时,它使用它从 shell 继承的文件句柄来写入 它的 输出,但这对 shell 是不可见的(尽管即使它是, shell 没有缓存它)。


但是,鉴于您正在使用 zsh,涉及外部命令时您应该问的第一个问题是,“我什至需要外部命令吗?”通常情况下,你不在这里。不要使用 find,只需使用 print 和 glob 即可获得相同的列表:

% print -l d*

然后再次使用相同的 glob 和限定符来选择第三个结果。

% cd d*([3])

(假设 d* 的扩展在运行 print 命令和运行 cd 命令之间不会改变。)

或者,您可以自己缓存结果:

% choices=( d* )
% print -l $choices
dir1
dir2
dir3
% cd $choices[3]

基于数组的解决方案也可以在 bash 中工作,尽管语法略有不同(并假设您的 find 命令足够简单,可以用 bash 的 glob 功能要弱得多。)

最后是select命令:

select d in d*; do
  cd "$d"; break;
done

这也将在 bash 中按原样工作,再次假设一个有效的 glob。

关于linux - 获取屏幕输出行作为命令的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49758997/

相关文章:

c - gwan -r 不读取最新文件

javascript - 用于更改 NVM Node 版本的 Bash 脚本

linux - Bash:如何检查是否只有一个 root id 并且所有用户 UID 都是唯一的?

bash - 除了 .bashrc 和 .bash_profile,我的环境变量在哪里?

c - 为什么 SIGINT 被发送到子进程并且什么都不做?

linux - 我的文件系统在树莓派 SD 卡中的空间

linux - 我可以在 awk 的记录分隔符中使用正则表达式吗?

c - 可以取消链接以读写方式打开的文件

bash - 使用 Bash 打开并将数据写入文本文件?

c - 在 c unix 中使用 flock(),尝试在另一个进程中打开文件时收到哪种错误?