【问题标题】:Bash. Redirecting output of grep into file重击。将grep的输出重定向到文件中
【发布时间】:2017-01-19 22:12:22
【问题描述】:

我有一个基本的 bash 脚本,我想用它在文件中创建目录列表。问题是,当我在终端上键入以下命令时,它可以正常工作,但在函数中使用时却不行

function Create_file_dirs()
{ 
    ls | grep / > dirs.txt
    cat dirs.txt #used for debugging
}

这个函数在一个脚本中,我通过调用脚本来运行它。 ./script.sh

`

命令 ls | grep / > dirs.txt 在终端窗口上工作得很好,并逐行生成一个列出目录的文件,但是在函数内部使用时没有做任何事情,我不知道为什么。谢谢

【问题讨论】:

  • 你是怎么调用函数的?
  • 在交互式提示中,ls 可能是ls -F 的别名。尝试使用ls -F | grep ...
  • 顺便说一句——Create_file_dirs() { set -- */; { [[ -d $1 ]] && printf '%q\n' "$@"; } >dirs.txt; } 是一种不需要ls(或shell 本身外部的其他命令)的编写方式,并且会在你的文件名以读者清楚的方式。 (function 关键字只会降低代码的可移植性;不要使用它)。
  • @CharlesDuffy 聪明的单行,但对许多用户来说可能有点难以破译?
  • @Fred,耸耸肩。这只是一个单行,因为我正在将它写入评论字段。如果您认为 ;s 太简洁,请将其替换为换行符。 lsobjectively a bad tool 对于任何用例,而不是纯粹人类消费的列表 - 如果您想要使用不太模糊的行为并且愿意消耗在 shell 外部启动进程的性能成本,更好的选择将是find

标签: bash shell directory


【解决方案1】:

ls 没有选项不会产生斜杠,所以 grep 什么也找不到。你可以很容易地在命令行上重现它,比如,

comand ls|grep /

【讨论】:

    【解决方案2】:

    感谢 William Pursell 的回答以及所有做出贡献的人。

    答案来自 William Pursell 的评论。 工作函数为:

        create_file_dirs()
    { 
        ls -F | grep / >./dirs.txt
        cat dirs.txt
    }
    

    问题是,当我在终端上运行 ls 命令时,我可以在目录名称后看到一个斜杠 / 并在终端上运行该命令实际上产生了预期的结果。

    ls | grep / > ./dirs.txt
    

    似乎虽然通过脚本运行 ls 不会在目录名称后产生斜杠 / 这就是为什么我必须添加它们 -F 选项来解决此问题。

    我测试它的方法是在脚本中使用这个简单的函数并运行脚本。结果没有斜线。

    test_dirs(){
        ls | cat
    } 
    

    【讨论】:

      猜你喜欢
      • 2017-07-06
      • 1970-01-01
      • 1970-01-01
      • 2014-10-31
      • 2014-03-03
      • 1970-01-01
      • 2016-08-09
      • 2013-10-11
      • 2023-03-19
      相关资源
      最近更新 更多