ack命令未从bash脚本中的当前目录返回输出

时间:2018-10-22 04:13:59

标签: bash shell ack

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

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

如何使用第一个脚本并给我想要的结果?

3 个答案:

答案 0 :(得分:0)

我认为这里的问题是:

您当前位于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。现在,它在something文件中找到txt,因此,您得到1作为输出(假设只有1条匹配行)。

答案 1 :(得分:0)

就像您编写脚本一样,它永远不会在同一目录中列出( ls 指令)和计数( wc 指令),因此无法保证结果。

此外,根据您将启动脚本的目录,它可能根本无法工作。

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

您确切知道系统上的什么位置吗? 一种替代方法是创建一个环境变量(例如在您的〜/ .bash_profile 文件中),并在脚本开始时使用它,以确保始终在正确的目录中运行它

答案 2 :(得分:0)

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

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

cd ..
findfile

它会给你1

感谢您回答我的问题