работа bash-скрипта отличается при запуске из строки и из файла
при написании скрипта непосредственно в bash всё исполняется "лучше",в чем при вызове того же кода из файла, в чём может быть причина?
> pid=(`pgrep konsole -u $USER | tr '\n' ' '`)
> for i in ${pid}; do SESSIONS=(`qdbus org.kde.konsole-$i | grep /Sessions/ | tr '\n' ' ' `); echo "i: "$i" Session #"$SESSIONS"\n" ; done
тут видно что существуют 2 процесс и в каждом запущено несколько вкладок
i: 906 Session #/Sessions/2
i: 906 Session #/Sessions/3
i: 906 Session #/Sessions/5
i: 906 Session #/Sessions/6
i: 906 Session #/Sessions/8
i: 906 Session #/Sessions/9
i: 917 Session #/Sessions/1
i: 917 Session #/Sessions/2
i: 917 Session #/Sessions/3
i: 917 Session #/Sessions/4
идентичный код записан в файл
#watcher.sh
pid=(`pgrep konsole -u $USER | tr '\n' ' ' `)
if [[ ${pid} ]] ; then
for i in ${pid} ; do
SESSIONS=(`qdbus org.kde.konsole-$i | grep /Sessions/ | tr '\n' ' ' `)
echo "pid: "$i" Session #"$SESSIONS"\n"
done
fi
вызываю
> ./watcher.sh
получаю:
pid: 906 Session #/Sessions/2\n
то есть из скрипта мало того, что echo не узнаёт \n и выводит как строку,
так ещё и массивы содержат только одно значение
система: manjaro, kde plasma, konsole, zsh
Зачем мне всё это? Хотел запоминать сессию в каждом окне терминала, нашел соответствующий скрипт, но тот отказался со мной работать...
Ответы (1 шт):
Эврика, друзья
я обнаружил что конструкция вызова утилит var=(` ... `)
при вызове из скрипта, по не явной причине возвращает, только один pid
в то же время, конструкция var=$(...)
работает одинаково при любом вызове
итоговый код моего отрывка выглядит следующим образом:
pid=$(pgrep konsole -u $USER | tr '\n' ' ' )
echo -e $pid"\n"
for i in ${pid} ; do
SESSIONS=$(qdbus org.kde.konsole-$i | grep /Sessions/ | tr '\n' ' ' )
echo -e "pid: "$i" Session #"$SESSIONS"\n"
done
ответ данного скрипта
906 917
pid: 906 Session #/Sessions/10 /Sessions/2 /Sessions/3 /Sessions/5 /Sessions/6 /Sessions/8 /Sessions/9
pid: 917 Session #/Sessions/1 /Sessions/2 /Sessions/3 /Sessions/4
наличие #!/bin/bash в первой строке никак не влияет на исполнение скрипта