ack 命令没有从 bash 脚本中的当前目录 return 输出

ack command didn't return output from current directory in bash script

(已编辑) 假设我有这样的目录结构:

lv1_directory
|  file_contain_word_something.txt
|  lv2_directory

所以现在我在 lv2_directory 并且我有这样的代码:

#!/bin/bash
findfile=$(ack -n 'something' . | wc -l)
cd ..
ls
echo $findfile

当我 运行 它给我的脚本时

lv2_directory            file_contain_word_something.txt
0

但如果我没有将它分配给变量,它就会像魅力一样工作

#!/bin/bash
cd ..
ls
ack -n 'something' | wl -l

它给我

lv2_directory            file_contain_word_something.txt
1

所以我必须把它改成这个才能工作

#!/bin/bash
findfile=$(ack -n 'something' .. | wc -l)
cd ..
ls  
echo $findfile 

它给了我想要的结果

lv2_directory            file_contain_word_something.txt
1

我怎样才能使用第一个脚本并给我想要的结果?

我认为这里的问题是:

您目前在 lv2_directory 没有 任何与字符串 'something' 匹配的文件。所以当你从这个目录本身触发 ack 时,你会得到 0 行数。然后你做 cd...

#!/bin/bash
findfile=$(ack -n 'something' . | wc -l)
cd ..
ls
echo $findfile

现在,在你的下一个片段中:

#!/bin/bash
cd ..
ls
ack -n 'something' | wl -l

您第一次做 cd,所以您进入 lv1_directory,其中有文件 file_contain_word_something.txt。然后你开火 ack。现在它在 txt 文件中找到 something,因此,输出 1(假设只有 1 个匹配行)。

就像你写的脚本一样,它永远不会在同一目录中列出(ls指令)和计数(wc指令) , 所以你没有结果保证。

此外,根据您将在其中启动脚本的目录,它可能根本不起作用。

您可以考虑在脚本开头管理路径(并且不要在指令之间修改它)吗?

您是否确切知道它在系统中的什么位置? 另一种方法是创建一个环境变量(例如在 ~/.bash_profile 文件中),并在脚本的开头使用它,确保它会总是 运行 在 good 目录中。

经过一些实验,我可以使用函数达到我想要的结果

#!/bin/bash
function findfile(){
    ack -n 'something' | wc -l
}

cd ..
findfile

它会给你 1

谢谢你回答我的问题