Похож Вы используете gedit
и evince
(рассмотрите использование исходных приложений для KDE, kwrite
и okular
соответственно), которые являются оба GTK 3.
Я имел эту подобную проблему и был решен темами установки GTK в KDE: установите kde-config-gtk
пакет и набор тема GTK (например, Кислородная тема - у меня нет Ubuntu здесь для проверки имени пакета, я думаю, что это oxygen-molecule
).
Читать grep
на стандартном входе. Вот вы идете, используя трубу ...
$ echo "$line" | grep select
... или последовательность ...
$ grep select <<< "$line"
Кроме того, вы можете заменить места новыми строками перед тем, как делать grepping:
$ echo "$line" | tr ' ' '\n' | grep select
... или вы можете попросить grep
напечатать только совпадение:
$ echo "$line" | grep -o select
Это позволит вам избавиться от остальной части строки, когда есть совпадение.
Изменить: Ой, читать слишком быстро, спасибо Марко . Чтобы подсчитать вхождения, просто поместите любой из них в wc (1)
;)
Еще одну правку, выполненную после комментария lzkata , цитируя $ line
при использовании echo
.
Нажатие Введите , чтобы завершить процесс в фоновом режиме.
Почти! Фактически, сценарий уже вышел к моменту нажатия Enter . Однако таким образом можно вернуть запрос (потому что оболочка снова печатает $ PS1
).
Причина, по которой нажатие клавиш Ctrl + C приводит к их завершению, заключается в том, что они связаны. При выполнении сценария оболочка инициирует субоболочку, в которой она выполняется. Когда вы завершаете этот подслой, фоновый процесс исчезает, вероятно, от сигнала SIGHUP
.
С помощью nohup
можно избавиться от этого небольшого неудобства.
#!/bin/sh
read -s -p "Enter Password: " pw
user=testuser
share=/fshare
cmd="sfk ftpserv -user=$user -pw=$pw -usedir $share=$share"
nohup $cmd &
от альтернативы
Если вы можете переключиться с /bin/sh
на /bin/bash
, вы также можете попытаться отказаться
. Для получения дополнительных сведений просто введите help disown
в экземпляре bash
.
disown -h $cmd &
Теперь, когда дело доходит до уничтожения процесса, вы можете идеально сделать « Ctrl + C », используя kill
. Только не отправляйте жестокий SIGKILL
. Вместо этого можно использовать:
$ kill -2 [PID]
$ kill -15 [PID]
, который отправит хороший SIGINT
(2) или SIGTERM
(15) в ваш процесс. Можно также распечатать значение PID после запуска процесса:
...
nohup $cmd &
echo $!
... или даже лучше, заставьте сценарий ждать SIGINT
и отправьте его обратно в фоновый процесс (при этом ваш сценарий останется на переднем плане) :
#!/bin/sh
read -s -p "Enter Password: " pw
user=testuser
share=/fshare
cmd="sfk ftpserv -user=$user -pw=$pw -usedir $share=$share"
nohup $cmd &
# Storing the background process' PID.
bg_pid=$!
# Trapping SIGINTs so we can send them back to $bg_pid.
trap "kill -2 $bg_pid" 2
# In the meantime, wait for $bg_pid to end.
wait $bg_pid
Если SIGINT
недостаточно, используйте вместо этого SIGTERM
(15):
trap "kill -15 $bg_pid" 2 15
В этом пути при получении скриптом SIGINT
( Ctrl + C , kill -2
) или SIGTERM
во время ожидания
фонового процесса он просто передает ему сигналы. Если эти сигналы действительно убивают экземпляр sfk
, то вызов wait
возвращается, что также приводит к завершению сценария:)