Команда ack не вернула вывод из текущей директории в bash-скрипте - PullRequest
0 голосов
/ 22 октября 2018

(отредактировано) Допустим, у меня есть какая-то структура каталогов, подобная этой:

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 голосов
/ 22 октября 2018

Как вы написали свой скрипт, он никогда не будет перечислять ( ls инструкция) и считать ( wc инструкция) в одном каталоге, поэтому у вас нет гарантии результата.

Кроме того, в зависимости от каталога, в котором вы будете запускать скрипт, он может вообще не работать.

Можете ли вы рассмотреть возможность управления путем в начале вашего скрипта (и не изменять его междуваши инструкции)?

Вы точно знаете, где он находится в системе?Альтернативой может быть создание переменной среды (например, в вашем файле ~ / .bash_profile ) и ее использование в начале вашего сценария, гарантируя, что она всегда будет выполняться в хорошем каталоге.

0 голосов
/ 22 октября 2018

после некоторого эксперимента я могу достичь желаемого результата, используя функцию

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

cd ..
findfile

, и она даст вам 1

спасибо за ответ на мой вопрос

0 голосов
/ 22 октября 2018

Я думаю, что проблема здесь в следующем:

В данный момент вы находитесь внутри 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 совпадающая строка).

...