Как определить, когда bash-скрипт запускается при связывании клавиш

Кажется, ошибка в 0.14, особенно со строками (работает, например, с помощью ints). Я здесь указал: https://github.com/pydata/pandas/issues/7300 . В качестве обходного пути вы можете обернуть его в список:

In [40]: fills
Out[40]: 
    Price  Symbol
0  109.70  BUD US
1  109.72  BUD US
2  183.30  IBM US
3  183.35  IBM US

In [41]: my_symbol = ['BUD US']

In [42]: fills.query('Symbol==@my_symbol')
Out[42]: 
    Price  Symbol
0  109.70  BUD US
1  109.72  BUD US

1
задан Dave S 6 March 2019 в 02:32
поделиться

2 ответа

Кажется, что самый простой способ решить вашу реальную проблему - это изменить привязку i3 на

bindsym --release $mod+Shift+t exec /usr/local/bin/myscript fromI3

и сделать

if [[ -n "$1" ]]; then
    echo "this was from a keybind"
else
    echo "this wasn't from a keybind"
fi

в вашем скрипте.

0
ответ дан jeremysprofile 6 March 2019 в 02:32
поделиться

False Positive

Как подсказывает большинство результатов в Google, вы могли бы использовать tty, который обычно возвращает «не tty» , когда он не запущен в терминале. Однако, похоже, что это отличается от сценариев, вызываемых через bindsym exec в i3 / Sway:

/dev/tty1  # From a keybind
/dev/pts/6 # In a terminal
/dev/tty2  # In a console

Хотя tty | grep pts частично отвечает на вопрос, он не может различить запуск в консоли против привязки клавиш, которая вам не нужна, если вы пытаетесь показать графический интерфейс.


Решение «Sort of»

Кажется, что при запуске с помощью привязки клавиш родительский процесс всегда имеет systemd. Имея это в виду, что-то вроде этого может работать:

{
    [ "$PPID" = "1" ] && echo "keybind" || echo "terminal"
} > /tmp/detect.log

Вероятно, безопасное предположение, что процесс systemd всегда будет иметь 1 в качестве PID, но есть нет никакой гарантии, что в каждой системе, использующей i3, также будет использоваться systemd, поэтому этого лучше всего избегать.


Лучшее решение

Более надежный способ - использовать ps. Согласно PROCESS STATE CODES на странице руководства:

Для форматов BSD и при использовании ключевого слова stat могут отображаться дополнительные символы:

<    high-priority (not nice to other users)
N    low-priority (nice to other users)
L    has pages locked into memory (for real-time and custom IO)
s    is a session leader
l    is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
+    is in the foreground process group

здесь ключ + в последней строке. Чтобы проверить это в терминале, вы можете вызвать ps -Sp <PID>, который будет иметь значение STAT, равное Ss, при работе «в интерактивном режиме», или S+, если он запускается с помощью связывания клавиш.

Так как вам нужен только столбец STATE, вы можете дополнительно очистить его с помощью -o stat=, который также удалит заголовки, а затем пропустите через grep, чтобы получить следующее:

is_interactive() {
    ps -o stat= -p $ | grep -q '+'
}

if is_interactive; then
    read -rp "Enter your username: " username
else
    username=$(yad --entry --text "Enter your username:")
fi

Это будет работать не только в эмуляторе терминала и через связывание клавиш i3 / Sway, но даже в необработанном окне консоли, что делает его гораздо более надежным вариантом, чем tty выше.

0
ответ дан Dave S 6 March 2019 в 02:32
поделиться