【问题标题】:sed not properly passing stdout to lssed 没有正确地将标准输出传递给 ls
【发布时间】:2013-02-03 14:43:24
【问题描述】:

我正在尝试在 sed 中编辑一个我遇到问题的简单字符串。 基本上我要做的是使用 pwd 获取我当前的工作目录,将其通过管道传输到 sed,编辑文件路径,然后使用 ls 检查文件路径内容。我需要这样做的原因是动态检查备份以查看备份是否包含我当前正在处理的文件夹中所需的文件(只是将其设置为快速热键)。

这是我目前得到的:

    pwd | sed "s/`whoami`/`whoami`.{daily,weekly,monthly}/g" | xargs ls

在我的服务器上运行它时(它是一个共享托管服务器,因此需要whoami 而不仅仅是用户名)我收到此错误:

    /bin/ls: cannot access /home1/username.{daily,weekly,monthly}: No such file or directory

但是,我可以毫无问题地运行此命令:

    ls /home1/username.{daily,weekly,monthly}

我已经尝试了大约 20 种该命令的不同变体(以及各种 sed 和 xargs 标志),但似乎无法使其正常工作。我相信这个错误是由 sed 处理搜索和替换流的方式引起的,但是我不知道如何解决它或者是什么确切导致它。

我相信是 sed 导致了这个问题,因为这个命令有同样的错误:

    ls `pwd | sed "s/$(whoami)/$(whoami).{daily,weekly,monthly}/g"`
    /bin/ls: cannot access /home1/username.{daily,weekly,monthly}: No such file or directory

如果有人能告诉我为什么会发生这种情况,或者 sed 以某种方式将编辑后的版本正确传递给 ls。我应该能够为它找出一个命令,我只需要知道为什么。谢谢!

【问题讨论】:

    标签: bash ssh sed ls xargs


    【解决方案1】:

    bash 扩展大括号,所以

    ls /home1/username.{daily,weekly,monthly}
    

    实际执行为

    ls /home1/username.daily /home1/username.weekly /home1/username.monthly
    

    名为/home1/username.{daily,weekly,monthly} 的目录不存在。 xargs 只会传递它接收到的任何内容,绕过 bash 大括号扩展。

    看这个:

    echo a{b,c}d
    >>> abd acd
    
    echo "a{b,c}d" | xargs echo
    >>> a{b,c}d
    

    所以你的问题不在于sed,也不在于ls。您需要找到一种手动进行扩展的方法。最简单的方法是使用eval(编辑:如 Adrian Pronk 所示)

    【讨论】:

      【解决方案2】:

      {daily,weekly,monthly} 字符串由 bash 解释,但 bash 看不到此字符串:它直接从 sed 传递到 xargsls

      要给bash 一个扩展字符串的机会,不妨试试:

      eval ls $(pwd | sed "s/`whoami`/`whoami`.{daily,weekly,monthly}/g")
      

      【讨论】:

      • 太棒了,我以前没有使用过 eval 但这正是我需要的。非常感谢。
      猜你喜欢
      • 2016-04-09
      • 2015-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多