Скрипт Bash выводит команду не найдена - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь создать bash-скрипт, который будет записывать в текстовые файлы вывод некоторых запросов pacman, в основном о том, какие пакеты установлены локально, какие пакеты установлены как зависимости, какие пакеты являются сиротами, и какие пакеты требуют каких зависимостей.В настоящее время я нахожусь в процессе решения проблемы, которая мешает мне написать, какие пакеты требуют каких зависимостей.Я использую следующий код bash:

#!/bin/bash

set -e -u

#Switch to PWD
cd /home/$USER/System/scripts/pacman-queries-output/

#Get the current date
DATE=`date +%m%d%Y`

#Pacman Queries
pacman --query -e >pacman_installed$DATE.txt
pacman --query -d >pacman_dependencies$DATE.txt
pacman -Qdt >pacman_orphans$DATE.txt

while read package_desc
do
    package_name=$(echo $package_desc| cut -d' ' -f 1)
    check_if_none=$(pacman -Qi $package_name | grep "Req" | sed -e 's/Required By    : //g')
    if $check_if_none != "Required By     : None"
    then
        echo $package_name >>pacman_required_by$DATE.txt
        pacman -Qi $package_name | grep "Req" | sed -e 's/Required By    : //g' >>pacman_required_by$DATE.txt
    fi
done < $PWD/pacman_installed$DATE.txt

echo 'Completed 'basename

Однако цикл while, похоже, не создает и / или не записывает в указанный мной текстовый файл, а повторяет это несколько раз в терминале:

. / Pacman-queries.sh: строка 20: Требуется: команда не найдена

Ниже приведена одна из итераций цикла while, который отображается при запуске bash -x pacman-queries.sh:

+ read package_desc
++ echo aesfix 1.0.1-4
++ cut '-d ' -f 1
+ package_name=aesfix
++ pacman -Qi aesfix
++ grep Req
++ sed -e 's/Required By    : //g'
+ check_if_none='Required By     : None'
+ Required By : None '!=' 'Required By     : None'
pacman-queries.sh: line 20: Required: command not found

Может ли кто-нибудь предложить какое-либо решение, которое может понадобиться для решения этой проблемы?Заранее спасибо.

1 Ответ

0 голосов
/ 02 декабря 2018
if $check_if_none != "Required By     : None"

Если check_if_none содержит строку:

check_if_none="Required By     : None"

Затем он расширяется до:

if Required By : None != "Required By     : None"

if пытается выполнить переданную ему команду.Поэтому он попытается выполнить команду Required.И он не находит такую ​​команду.

Как это исправить:

  • используйте test [ .. ] или [[ ... ]] для сравнения в bash
  • всегда указывайте свои переменные "$varvar"

if [ "$check_if_none" != "Required By     : None" ]

Также:

  • не используйте обратные галочки.Они менее читабельны, не могут быть вложенными и устарели .

Ваш скрипт после некоторого исправления может выглядеть так:

#!/bin/bash

set -e -u

#Switch to PWD
cd "/home/$USER/System/scripts/pacman-queries-output/"

#Get the current date
DATE=$(date +%m%d%Y)

#Pacman Queries
pacman --query -e >"pacman_installed$DATE.txt"
pacman --query -d >"pacman_dependencies$DATE.txt"
pacman -Qdt >"pacman_orphans$DATE.txt"

while IFS= read -r package_desc; do

    package_name=$(echo "$package_desc" | cut -d' ' -f 1)

    # renamed from check_if_none
    # some newlines for readability
    Required=$(
          pacman -Qi "$package_name" | 
          grep "Req" | 
          sed -e 's/Required By    : //g'
    )

    if [ "$Required" != "Required By     : None" ]; then

        echo "$package_name" 
        # runnung `pacman -Q` twice is just throwing cpu cycles...
        echo "$Required"

    fi
# All output goes into required_by - moved it here
# also changed `>>` into `>`
done < "$PWD/pacman_installed$DATE.txt" > "pacman_required_by$DATE.txt"

echo 'Completed 'basename
...