Как сценарий Bash может сказать, как он был выполнен?

Следующие работы в ударе 4.2:

list=( /<root_path>/<process_two_path>/logs/* )
echo "${list[-1]}"

Если Ваш удар является более старой версией:

list=( /<root_path>/<process_two_path>/logs/* )
echo "${list[${#list[@]}-1]}"
9
18.10.2014, 17:08
4 ответа

из Человек Bash Под Условные выражения :

-t fd  
    True if file descriptor fd is open and refers to a terminal.

Предполагая, что FD 1 является стандартным, , если [-T 1]; Тогда должен работать для вас. Руководство по скриптуре утверждает, что --t , используемый таким образом SSH SSH , и что тест (с использованием stdin, не STDOUT) должен быть:

if [[ -t 0 || -p /dev/stdin ]]

-P Испытания, если файл существует и представляет собой названную трубу. Однако , я бы отметил, что это не относится к мне: -P / dev / stdin не выполняется как для нормальных клемм, так и для сессий SSH, тогда как , если [-t 0] (ИЛИ -T 1 --t 1 ) работает в обоих случаях (см. Также Gilles Comments ниже о проблемах в этом разделе Усовершенствованного руководства Screpting Screpting ).


Если основной проблемой является специализированным контекстом, из которого вы хотите вызвать скрипт, чтобы вести себя в способе, подходящим для этого контекста, вы можете отозвать все эти технические характеристики и сохранить себя немного суеты, используя обертку и пользовательскую переменную:

!#/bin/bash

export SPECIAL_CONTEXT=1
/path/to/real/script.sh

Вызовите это live_script.sh или что-то еще и дважды щелкните этому вместо этого. Конечно, вы можете выполнить то же самое с аргументами командной строки, но обертка все равно потребуется, чтобы сделать точку и щелкнуть в работе браузера файлов GUI.

9
27.01.2020, 20:07
mkfs.vfat -s 64 /dev/scd1

Предположим, вы хотите отформатировать с 64 сектором на кластер, да, вы можете сделать это с вышеуказанной командой. / dev / scd1 относительно вашего устройства.

-121--108679-

Другой, используя параметры Bash, установите внутреннюю переменную, $ - .

из .bashrc ,

# If not running interactively, don't do anything
case $- in
    *i*) ;;
    *) return;;
esac
-2
27.01.2020, 20:07

Используйте переменную bash $SHLVL для определения уровня вложенности оболочки. В сценарии, запускаемом «сырым» двойным -щелчком, это будет 1, в сценарии, работающем в терминале, это будет 2.

#!/bin/bash
if (( SHLVL < 2 )) ; then
    echo "Please run this from a terminal."
    read -p "Press <Enter> to close this window"
    exit 1
fi
# rest of script

Примечание :$ не требуется при тестировании числовых переменных в(()).

2
27.01.2020, 20:07

Хотя ответ Златовласки, вероятно, верен в типичном случае, кажется, что есть крайние случаи. В моем собственном случае мой xserver настроен на запуск с tty1и никогда не покидает этот tty. Если Xorg stdoutявляется TTY, то кажется, что клиенты будут иметь этот TTY, связанный с их файловым дескриптором по умолчанию.

Вот как я решил свою проблему:

#!/bin/bash
isxclient=$( readlink /dev/fd/2 | grep -q 'tty' && [[ -n $DISPLAY ]] ; echo $? )
if [[ ! -t 2  || $isxclient == "0" ]]; then
        notify-send "Script wasn't started from an interactive shell"
else
        echo "Script was started from an interactive shell"
fi

Я не проверял, работает ли это на более стандартной конфигурации X, и я также очень сомневаюсь, что это единственный пограничный случай. Если кто-нибудь найдет более универсальное решение, пожалуйста, вернитесь и сообщите нам.

0
31.01.2020, 11:18

Теги

Похожие вопросы