【问题标题】:find grep works in commandline but fails in script; autoescaping by shell?find grep 在命令行中有效,但在脚本中失败;外壳自动转义?
【发布时间】:2013-02-25 20:53:33
【问题描述】:

更新
再次尝试后,结果证明该脚本完全按照应有的方式工作。我一定是太累了,做了一些愚蠢的事情,让我认为剧本是错误的,而实际上是我自己。 :-(
非常感谢您的帮助 chepner、shellter、William、glenn 和 Jonathan,我想我的困惑实际上是由我在当前目录“执行查找”引发的。
感谢您的提示!

此线程已准备好关闭。

考虑以下几点:

find . | grep -E ".*\.log$"

如果这是在命令行运行,它会按预期工作,即 打印出所有以.log结尾的目录和文件

但是在脚本中,例如:

#!/bin/sh
find . | grep -E ".*\.log$"

它失败了。打开set -x 进行检查时,我注意到在 脚本执行正则表达式 .*.log$ 是 (auto-??) 用单引号引用,例如:

\+ find .
\+ grep -E '.*\.log$'

即使我的代码包含双引号。 我该如何预防 这个?

限制:

  • 挑战是同时使用findgrep,不允许使用其他命令
  • 同样,挑战在于使用 both,而不仅仅是 find,因为有人可能想要建议
  • 进一步的信息,用于grep 的正则表达式比这里显示的要复杂得多(几个OR 分开 RegExps),我在这里对其进行了简化,因为这很烦人 一个已经

我已经为此工作了 4 多个小时,但没有结果。我搜索过 谷歌和 StackOverflow,但我没有发现任何相似之处。我担心 解决方案非常简单,我太愚蠢了,找不到它? :-(

任何帮助表示赞赏,谢谢!

【问题讨论】:

  • shell 只是以规范的形式回显命令。 '.*.log$'".*\\.log$" 产生等效的字符串。 “失败”是什么意思?没有输出?输出不正确,如果是,那是什么?另外,您是否从运行find 命令的同一目录运行脚本?
  • 是的,不用担心'.*\.log$',这只是显示跟踪信息的一种标准化方式。在您的脚本中的 find cmd 之前添加一个 echo $PWD,我会让您看到您没有在您认为自己所在的目录中开始搜索。
  • 在这种情况下,您的双引号所做的唯一事情就是变成“\\.”。进入“\.”,这就是您在 -x 输出中看到的内容(以及您想要的内容)。
  • 您的查找位置是“。” -- 当前目录。您的脚本是否位于正确的位置?你需要在脚本中cd吗?
  • @chepner 我所说的“失败”是指它只是打印出所有内容,而不是像我预期的那样只打印日志文件。

标签: shell command-line grep find


【解决方案1】:

您使用的是什么操作系统和可执行版本?

你的小脚本:

#!/bin/sh
find . | grep -E ".*\.log$"

#!/bin/bash
find . | grep -E ".*\.log$"

在 Debian Wheezy 上完美运行(单反斜杠或双反斜杠)

yba@tavas:~$ bash --version
GNU bash, version 4.2.37(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
yba@tavas:~$ grep --version
grep (GNU grep) 2.12
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and others, see <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.

你的脚本在什么意义上失败了?

这是示例输出:

yba@tavas:~$ ./st.sh 
./Downloads/serial_update_rev11.log
./.virt-manager/virt-manager.log
./Android/adt-bundle-linux/eclipse/configuration/org.eclipse.update/install.log
./Android/workspace/.metadata/.plugins/org.eclipse.cdt.core/.log
./Android/workspace/.metadata/.log
./ti-dvsdk_dm365-evm_4_02_00_06/xdctools_3_16_03_36/eclipse/plugins   /org.eclipse.rtsc.xdctools.product_3.16.3.36/META-INF/Make.log
./ti-dvsdk_dm365-evm_4_02_00_06/codecs-dm365_4_02_00_00/packages/ittiam/codecs/g711_dec    /hs_err_pid17410.log
./.local/share/gvfs-metadata/root-dfdae0ca.log
./.local/share/gvfs-metadata/label-AR7266WnX\x20V2_1.2-a6becf19.log
./.local/share/gvfs-metadata/home-2def37e1.log
./.local/share/gvfs-metadata/uuid-5c7747c5-81e5-4464-bae0-2c61afc73da4-7a539d2d.log
 ./.local/share/tracker/tracker-store.log
./.local/share/tracker/tracker-miner-fs.log
./.local/share/tracker/tracker-extract.log
yba@tavas:~$

【讨论】:

  • 非常感谢乔纳森,你说得对,我不知道为什么,但突然间脚本完全按照我的预期工作,即使我没有改变任何东西。我一定是太累了,做了一些愚蠢的事情,让我认为剧本是错误的,而实际上是我自己。 :-(
猜你喜欢
  • 2013-09-28
  • 2017-04-01
  • 2021-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 2021-11-13
相关资源
最近更新 更多