cd && ls | grep:如何在当前shell中执行命令并传递输出

波尔

我创建了一个别名,以免每次进入新目录时都写ls:

alias cl='cd_(){ cd "$@" && ls; }; cd_'

假设我有一个名为“ Downloads”的文件夹(我当然有),所以我只需在终端中键入以下内容:

cl Downloads

现在,我将在“下载”文件夹中找到自己,并接收该文件夹中包含的内容的列表,例如:example.txt,hack.hs,picture.jpg,...

如果我想移至目录并查看是否存在hack.hs,可以尝试执行以下操作:

cl Downloads | grep hack

我得到的只是输出:

黑客

但是我将保留在原来的文件夹中(这意味着我不在“下载”中)。

我知道发生这种情况是因为每个命令都在子shell中执行,因此cd Downloads && ls在其自身的子shell中执行,然后输出(即我拥有的东西的列表)通过管道重定向到grep。这就是为什么我不在新文件夹中的原因。

我的问题如下:

为了能够编写“ cl Downloads | grep hack”之类的东西并获得“ hack”式的东西清单并位于Downloads文件夹中,我该怎么做?

谢谢你,波尔


对于曾经使用此工具的任何人:@gniourf_gniourf提出一个快速解决方案

cl Downloads > >(grep hack)

有人将此问题标记为Make bash别名可能与重复项重复,但我的bash别名已接受参数的事实表明事实并非如此。当前的问题是关于如何在当前shell中执行命令,同时将输出重定向到另一个命令。

查尔斯·达菲

如您所知(以及BashFAQ#24中所述),原因是

{ cd "$@" && ls; } | grep ...

...防止在cd外壳中可见的结果是POSIX不能保证在外壳中运行管道的任何组件。(某些外壳程序,包括ksh [开箱即用]和启用了非默认选项的非常现代的bash,有时会或可选地运行父外壳程序中的管道的最后一部分,但这无法移植在)。

适用于所有POSIX shell的一种避免这种情况的方法是将输出定向到命名管道,从而避免建立管道:

mkfifo mypipe
grep ... <mypipe &
{ cd "$@" && ls; } >mypipe

在现代的ksh和bash中,有一种较短的语法可以为您完成此操作-/dev/fd如果操作系统提供该功能,则使用条目而不是设置命名管道:

{ cd "$@" && ls; } > >(grep ...)

在这种情况下,>(grep ...)将其替换为指向FIFO或/dev/fd条目的文件名,当该文件写入相关进程时,该文件名将输出重定向到grep-但没有管道。


顺便说一句-我确实希望您ls以此方式作为示例。ls对于所有可能的文件名的范围,输出的规范都不够明确,因此grepping本质上是不可靠的。printf '%s\0' *如果您确实想生成流式结果,请考虑使用发出NUL分隔的目录中非隐藏名称的列表。或使用glob表达式检查匹配特定模式的文件(BashFAQ#4涵盖了类似情况);如果您需要比POSIX模式支持更全面的regex匹配支持,则可以使用extglobs

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

是否可以在UITextField中设置较大的空间

来自分类Dev

从git bisect错误中恢复更有针对性吗?

来自分类Dev

GIT SVN:在没有错误的合并父级的情况下获取重新创建的SVN分支

来自分类Dev

合并Kinvey中的用户

来自分类Dev

如何在核心数据模型iOS中找出特定属性索引的值

来自分类Dev

执行(cd和ls)和前叉呼叫C

来自分类Dev

为什么ls〜/ .ssh可以工作,而cd〜/ .ssh却不能工作?

来自分类Dev

PostgreSQL:有效地将JSON数组拆分为行

来自分类Dev

别名cd和ls支持空格和参数

来自分类Dev

如何为cd和ls创建别名?

来自分类Dev

在网络文件夹上使用ls和cd命令

来自分类Dev

别名cd和ls支持空格和参数

来自分类Dev

重新定义cd为“ cd <directory> ls -F”问题

来自分类Dev

如何为cd编写别名,使其进入刚进入cd的目录后会触发ls?

来自分类Dev

ls不会给我与cd + ls相同的文件夹

来自分类Dev

执行bash命令“ cd / usr / share /; ls * z”时得到奇怪的结果

来自分类Dev

在tcsh中的cd之后是ls吗?

来自分类Dev

在一个命令中,将CD切换到ls -lt之后的最新修改目录

来自分类Dev

是否有捷径可以重新运行带有最后一个命令的参数的命令(不是cd,ls或echo)

来自分类Dev

命令有效,然后无效(cd / ls)

来自分类Dev

cd和ls权限被拒绝

来自分类Dev

需要描述用于在不使用ls或cd的情况下删除文件夹内容的命令

来自分类Dev

-bash:/ bin / cd:没有这样的文件或目录-cd之后自动执行ls

来自分类Dev

我如何在cshrc中先进行cd刻录然后再执行ls

来自分类Dev

特定目录对于“ ls”和“ ls -la”是完全不可见的,但是我可以“ cd”进入该目录

来自分类Dev

如何使用索引而不是名称进行ls / cd

来自分类Dev

如何使用cd和ls跳到目录(选择列和项目)?

来自分类Dev

修改cd选项卡自动补全以显示类似ls -la

来自分类Dev

怎么可能在 /home `ls` 返回 `valo` 而 `cd /valo` 返回 `No such file or directory`?

Related 相关文章

  1. 1

    是否可以在UITextField中设置较大的空间

  2. 2

    从git bisect错误中恢复更有针对性吗?

  3. 3

    GIT SVN:在没有错误的合并父级的情况下获取重新创建的SVN分支

  4. 4

    合并Kinvey中的用户

  5. 5

    如何在核心数据模型iOS中找出特定属性索引的值

  6. 6

    执行(cd和ls)和前叉呼叫C

  7. 7

    为什么ls〜/ .ssh可以工作,而cd〜/ .ssh却不能工作?

  8. 8

    PostgreSQL:有效地将JSON数组拆分为行

  9. 9

    别名cd和ls支持空格和参数

  10. 10

    如何为cd和ls创建别名?

  11. 11

    在网络文件夹上使用ls和cd命令

  12. 12

    别名cd和ls支持空格和参数

  13. 13

    重新定义cd为“ cd <directory> ls -F”问题

  14. 14

    如何为cd编写别名,使其进入刚进入cd的目录后会触发ls?

  15. 15

    ls不会给我与cd + ls相同的文件夹

  16. 16

    执行bash命令“ cd / usr / share /; ls * z”时得到奇怪的结果

  17. 17

    在tcsh中的cd之后是ls吗?

  18. 18

    在一个命令中,将CD切换到ls -lt之后的最新修改目录

  19. 19

    是否有捷径可以重新运行带有最后一个命令的参数的命令(不是cd,ls或echo)

  20. 20

    命令有效,然后无效(cd / ls)

  21. 21

    cd和ls权限被拒绝

  22. 22

    需要描述用于在不使用ls或cd的情况下删除文件夹内容的命令

  23. 23

    -bash:/ bin / cd:没有这样的文件或目录-cd之后自动执行ls

  24. 24

    我如何在cshrc中先进行cd刻录然后再执行ls

  25. 25

    特定目录对于“ ls”和“ ls -la”是完全不可见的,但是我可以“ cd”进入该目录

  26. 26

    如何使用索引而不是名称进行ls / cd

  27. 27

    如何使用cd和ls跳到目录(选择列和项目)?

  28. 28

    修改cd选项卡自动补全以显示类似ls -la

  29. 29

    怎么可能在 /home `ls` 返回 `valo` 而 `cd /valo` 返回 `No such file or directory`?

热门标签

归档