【问题标题】:zsh: create named file in place of argument?zsh:创建命名文件代替参数?
【发布时间】:2021-11-02 21:32:45
【问题描述】:

realpath <<<'foo' 失败“真实路径:缺少操作数”。我不知道那是什么意思。

realpath <(<<<'foo') 返回/proc/3443695/fd/pipe:[26244650] 我猜这意味着它正在创建一个包含字符串“foo”的临时管道。

或者printf 更清楚:

❯ printf "%q" <<<'foo'  # no output
❯ printf "%q" <(<<<'foo')
/proc/self/fd/11%   

我试图调用的实际程序不喜欢其中任何一个。我想我需要一个实际的文件。

我可以在多个命令中通过使用mktemp 创建一个文件然后写入它,然后将其作为arg 发送出去,但是zsh 是否有任何方便的语法可以就地执行此操作? 1 班轮?

【问题讨论】:

  • realpath 不读取标准输入。因此realpath &lt;&lt;&lt;foo 没有意义。
  • @user1934428 对。我不太确定&lt;&lt;&lt; 到底做了什么。我猜它会将右边的字符串发送到stdin&lt;&lt; 启动一个heredoc,&lt; 把右边的file发送到stdin?
  • 那时仍然对&lt;(&lt;&lt;&lt;'foo') 语法感到困惑。如果 "foo" 将在子 shell 中进入标准输入,而 &lt; 需要一个文件名,那么如何从中获取 "/proc/self/fd/11" 作为参数?
  • @mpen:注意&lt;...(重定向)与&lt;(...)(进程替换)不同。尖括号在 shell 语法中用于许多不同的事情;混乱是很正常的:)。
  • @user1934428: &lt;(&lt;&lt;&lt;something) 确实会产生输出 - 试试 cat &lt;(&lt;&lt;&lt;something)。它可用于通过此处字符串 (&lt;&lt;&lt;) 将文本发送到仅接受输入文件且不理解标准输入的程序。 &lt;(print something) 会达到同样的效果。

标签: zsh


【解决方案1】:

看起来=(list) 进程替换应该可以满足您的需求。

来自zshexpn 手册页:

如果使用 =(...) 而不是 ...
进程替换创建的临时文件会在函数退出时被删除。

在我的系统上,realpath =(&lt;&lt;&lt;'foo') 返回类似于 /private/tmp/zsh3YAdDx 的内容,即执行命令后确实似乎被删除的临时文件的名称。

作为奖励,文档指出,在某些情况下,=(&lt;&lt;&lt;...) 表单经过优化,可以在当前 shell 中完全执行。

【讨论】:

  • 非常酷! Zsh 有一个操作员来处理所有事情?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
  • 2020-10-07
  • 2019-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多