没有正确地将stdout传递给ls

时间:2013-02-19 02:09:34

标签: bash ssh sed ls xargs

我正在尝试在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如何处理搜索和替换为流引起的,但是我不知道如何绕过它或者完全是什么导致它。

我认为这导致了问题,因为此命令具有相同的错误:

    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。我应该能够找到它的命令,我只需要知道原因。谢谢!

2 个答案:

答案 0 :(得分:2)

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

要为bash提供扩展字符串的机会,请尝试:

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

答案 1 :(得分:0)

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所示)