Проверка выполнения сценария [дубликат]

Вы выполняете цикл от 1 до [количество аргументов], а затем проверяете, действительно ли каждое из этих чисел является каталогом. Было бы проще сделать что-нибудь вроде:

#!/bin/bash
for item in "$@"; do  # iterate over the arguments themselves
    if [[ ! -d "$item" ]]; then
        echo "$item is not a directory" >> file.txt
    else
        DIRECTORY=$(ls -l $item | grep ^d | wc -l)
        LINK=$(find $item -type l | wc -l)
        FILE=$(ls -A $item | wc -l)

        echo `date "+%H:%M:%S %d-%m-%y"` directory $item file count: $FILE link count: $LINK subdirectory count: $DIRECTORY >> file.txt
    fi
done
3
14.11.2016, 19:28
3 ответа

Это происходит потому, что grep и ps запускаются параллельно, поэтому grep процесс соответствует, потому что целевая строка test1.sh появляется как его аргумент в ps . Простой, но, вероятно, неоптимальный способ обойти это:

ps -ef | grep "test1.sh" | grep -v "grep"

Второй конвейер принимает вывод первого и исключает строки, содержащие совпадение со строкой «grep».

1
27.01.2020, 21:12

Вы можете просто проигнорировать grep по одному из следующих: -

ps -ef | grep test1.sh | grep -v grep

else: -

ps -ef | grep "[t]est1.sh"

Второй вид спускается, и это экономит много времени.

2
27.01.2020, 21:12

Если вы просто хотите посмотреть, работает ли он, а не выводите ps по каналу grep , вы можете используйте pgrep . Это будет выводить только PID процесса и будет намного более эффективным. Я использую флаг -x , чтобы он точно соответствовал имени test1.sh

pgrep -x test1.sh
876

. Если вы хотите видеть имя команды, вы также можете использовать -l ] флаг.

pgrep -xl test1.sh
876 test1.sh

А если вы хотите выполнить частичное совпадение, вы можете просто удалить -x

pgrep -l test
876 test1.sh
877 test2.sh
888 test123.sh
8745 test.bin
4
27.01.2020, 21:12

Теги

Похожие вопросы