Следующие работы в ударе 4.2:
list=( /<root_path>/<process_two_path>/logs/* )
echo "${list[-1]}"
Если Ваш удар является более старой версией:
list=( /<root_path>/<process_two_path>/logs/* )
echo "${list[${#list[@]}-1]}"
из Человек 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.
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
Используйте переменную 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
Примечание :$ не требуется при тестировании числовых переменных в(()).
Хотя ответ Златовласки, вероятно, верен в типичном случае, кажется, что есть крайние случаи. В моем собственном случае мой 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, и я также очень сомневаюсь, что это единственный пограничный случай. Если кто-нибудь найдет более универсальное решение, пожалуйста, вернитесь и сообщите нам.