macos - Bash pwd 并打开管道不工作

标签 macos bash unix terminal

<分区>

我正在学习如何在 bash 中使用 I/O 重定向,并尝试了一些使用管道的示例,例如:

pwd | say
ls -l | grep "staff" > out.txt

但是当我尝试使用管道重定向同时使用 pwdopen 时,命令失败,我只收到 open 用法。

我正在尝试的是:pwd |打开

从 bash 打开当前目录的正确方法是什么?

最佳答案

事后看来,有2个不同的答案:


答:按要求回答 OP 的问题,以理解管道I/O 流:

echo . | xargs open

# Equivalent solution, using the special "$PWD" shell variable.
printf '%s\0' "$PWD" | xargs -0 open

是将当前目录的路径传递给 open CLI 通过管道 以使其在 OSX 的文件系统浏览器中打开该目录的最可靠方法GUI 应用程序,Finder

注意 pwd | xargs open 并不健壮,因为如果当前目录路径包含空格,它就会失败 - 见下文。

  • open要求通过命令行参数而不是通过stdin输入流提供输入,就像这里的情况一样(通过管道,|)。
  • 因此,为了将标准输入转换为参数,需要标准的xargs 实用程序
  • xargs采用标准输入 - 在本例中来自管道 - 并调用指定为参数的命令(打开 ,在这种情况下)将标记化的标准输入作为该命令的参数
  • xargs 默认按 whitespace 分割:
    • 使用 . 作为输入,不会发生拆分(或由 shell 解释),因此它可以被 echoed 到 xargs .
    • 相比之下,始终包含当前目录完整路径的特殊 $PWD shell 变量可能包含嵌入空格,因此需要额外的步骤来确保它作为单个参数传递给open:
      • printf '%s\0' "$PWD" 打印以 NUL 字节 (0x0) 结尾的当前目录的完整路径。
      • 作为补充,xargs -0 通过 NUL 将 stdin 输入拆分为标记 - 在这种情况下产生单个标记,保留单个输入行的值 - 包含 $PWD - 原样。这样做是安全的,因为 NUL 不是文件名中的合法字节。
        • 注意:-0POSIX standard for xargs非标准扩展 ,但它同时在 BSD xargs(在 OSX 上使用)和 GNU xargs(在 Linux 上使用)中实现。保持 POSIX 兼容[1],下一个最好的办法是使用基于 line 的标记化和 -I 选项,如下所示:
          printf '%s' "$PWD"| xargs -I % 打开 %

因此,实际上,上述解决方案等同于(xargs 最终执行的内容 - 参见下一节的解释):

open . 

# Equivalent solution.
open "$PWD"

[1] xarg-I 选项需要一个也是XSI 的POSIX 系统- 合规。如果有人能用实用的术语向我解释这意味着什么,我将不胜感激。


B:提供最佳答案不限制使用的技术:

open .

open 需要参数 而不是 stdin 输入,而 . 简洁且最有效地表示当前目录,导致 openFinder 中显示当前文件夹的内容。

一个等效但更冗长的解决方案是传递特殊的 shell 变量 $PWD,它始终包含当前目录的完整路径(在 双引号 中引用,以保护它不受 shell expansions 的影响:

open "$PWD"

关于macos - Bash pwd 并打开管道不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29778479/

相关文章:

macos - 安装MacVim以使用gvim

macos - XCode 中的文件加密

unix - iconv unicode未知输入格式

css - 防止在 WebKit/Blink 中为 MacOS 触控板用户隐藏滚动条

macos - Mac OSX上的XAMPP:为什么以 'daemon'身份运行?

linux - 是否可以传递 linux bash 脚本的内部命令请求的参数?

bash - 使用 grep 和 cut delimiter 命令(在 bash shell 脚本 UNIX 中)- 和 "reversing"一样吗?

bash - cygwin 中 bash 的缓慢加载时间

node.js - 阻止 Node 进程退出的最简单的代码量是多少?

linux - 无法 dlopen 加载模块 '/usr/lib/pa20_64/libpthread.1',因为它包含线程特定数据