LINUX.ORG.RU

Почему скрипт bash работает не как я представляю?

 


0

1

в общем имеется скрипт, который призван тогглировать запуск deadbeef (т.е. если deadbeef запущен, то завершаем его, если нет — запускаем).

сделал:

--> cat .config/i3/deadbeef_toggle.sh
#! /bin/bash
if [[ -n $(pgrep deadbeef) ]]
then
        deadbeef --quit
else
        deadbeef
fi


почему то запускается только «deadbeef --quit» (т.е. запуск и выход получается)

★★

Последнее исправление: safocl (всего исправлений: 1)

Ответ на: комментарий от safocl

а поч нормальное условие не работает то?

Во-первых, заключи у себя $(pgrep deadbeef) в кавычки. Во-вторых, коль скоро тебе надо запустить deadbeef, если его нет, то и проверяй, запущен он или нет — кода возврата pgrep deadbeef для этого более чем достаточно. Более того, если deadbeef --quit завершается с ненулевым кодом в отсутствие deadbeef, то можно вообще сделать deadbeef --quit || deadbeef.

dexpl ★★★★★
()

Так а просто pgrep deadbeaf работает?

Вот я у себя попробовал чуть модифицированный твой вариант.

#!/bin/bash

PROGNAME=$1

if [[ -n $(pgrep $PROGNAME) ]]
then
    echo "$PROGNAME is running."
else
    echo "$PROGNAME not ronning."
fi

У меня всё отрабатывает нормально с любыми программами. Если что, для отладки можешь пускать скрипт с помощью bash -x scriptname.sh

shell-script ★★★★★
()
Ответ на: комментарий от Radjah

ну так все норма, почему скрипт тада не запускает deadbeef, а запускает и сразу завершает, как будто с опцией --quit??

safocl ★★
() автор топика
Ответ на: комментарий от shell-script

очень кстати странно, но если запускать как «bash .config/i3/deadbeef_toggle.sh» то все роббит...

safocl ★★
() автор топика
Ответ на: комментарий от safocl

Значит ему, судя по всему, нужен терминал. Я им не пользуюсь, поэтому не скажу точно. Поищи в манах, может у него есть какие-нибудь опции типа --daemon или --background, или чего-то подобного.

shell-script ★★★★★
()
Ответ на: комментарий от safocl

ибо если вписать в конфиг такой запуск, то все роббит:

bindsym XF86AudioPlay exec "bash $HOME/.config/i3/deadbeef_toggle.sh"

safocl ★★
() автор топика

в подробности приведенного скрипта не вдавался, но у меня что-то подобное есть, которое я в «кнопку» завершения сеанса Ob прописал, работает, пользуюсь:

if [ -x "/usr/bin/deadbeef" ]; then
ddb=$(pgrep -f "deadbeef")
 if [ -n "$ddb" ]; then
	ddb_np=$(deadbeef --nowplaying %e)
	sleep 1
	if [ "$ddb_np" != "$(deadbeef --nowplaying %e)" ]; then	
	 deadbeef --pause && deadbeef --quit
	else
	 deadbeef --quit
	fi
 fi
fi

NK ★★★★★
()
Ответ на: комментарий от NK

ну в общем тут дело не в скрипте. посмотри видос, станет все ясно...

почему то скрипт не запускается нормально без вставки впереди него слова bash

safocl ★★
() автор топика
Ответ на: комментарий от safocl

Потому что у тебя там башизм, а по-умолчанию скрипты обрабатываются dash.

anonymous
()
Ответ на: комментарий от dexpl

pgrep deadbeef && deadbeef --quit || deadbeef

Ну не используйте «||» в таких конструкциях! Чревато же багами!

Kroz ★★★★★
()
Ответ на: комментарий от deadNightTiger

хмм. интересное предположение...
ну а почему тогда с запуском после команды «bash» все запускается?

т.е. мне надо в проверке процессов поставить флаг -f?

safocl ★★
() автор топика
Последнее исправление: safocl (всего исправлений: 1)
Ответ на: комментарий от deadNightTiger

да... точно.. спс. переименовал и все норм запускается...

в общем плане работает вот так:

--> cat .config/i3/deadbeef_toggle.sh
#! /bin/bash

if pgrep -f '^deadbeef$'>/dev/null
then
        deadbeef --quit
else
        deadbeef
fi
т.е. надо начало и конец строки в слове указать, чо бы искалось только одно слово без доп символов.

safocl ★★
() автор топика
Последнее исправление: safocl (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.