Я пошел бы с этим как первый шаг:
ls /etc/*release
Хинду, RedHat, Arch & SuSE назвали файл, например. /etc/gentoo-release
. Кажется, популярен, проверяет этот сайт о файлах версии.
Debian & Ubuntu должна иметь a /etc/lsb-release
который содержит информацию о выпуске также и обнаружится с предыдущей командой.
Другой быстрый uname -rv
. Если установленное ядро будет ядром дистрибутива запаса, то Вы будете обычно иногда находить имя там.
Присвоение оболочки является отдельным словом без пространства после знака "равно". Таким образом, то, что Вы записали, присваивает пустое значение thefile
; кроме того, так как присвоение сгруппировано с командой, оно делает thefile
переменная среды и присвоение локальны для той конкретной команды, т.е. только вызова к ls
видит присвоенное значение.
Вы хотите получить вывод команды, таким образом, необходимо использовать замену команды:
thefile=$(ls -t -U | grep -m 1 "Screen Shot")
(Некоторая литература показывает альтернативный синтаксис thefile=`ls …`
; синтаксис одинарной левой кавычки эквивалентен синтаксису долларовых круглых скобок за исключением того, что заключение в кавычки в одинарных левых кавычках иногда является странным, поэтому просто используйте $(…)
.)
Другие комментарии о Вашем сценарии:
-t
(вид ко времени) с -U
(не сортируйте), не имеет смысла; просто используйте -t
.Вместо использования grep
для соответствия снимкам экрана это более ясно передать подстановочный знак ls
и используйте head
получать первый файл:
thefile=$(ls -t *"Screen Shot"* | head -n 1)
Это обычно - плохая идея проанализировать вывод ls
. Это могло перестать работать вполне плохо, если у Вас есть имена файлов с непечатаемыми символами. Однако сортировка файлов по дате является трудной без ls
, таким образом, это - приемлемое решение, если Вы знаете, что у Вас не будет непечатных символов или обратных косых черт в именах файлов.
Всегда используйте двойные кавычки вокруг подстановок переменных, т.е. здесь запишите
echo "Most recent screenshot is: $thefile"
Без двойных кавычек повторно расширено значение переменной, который доставит неприятности, если это будет содержать пробел или другие специальные символы.
set -e
. Это говорит оболочке выходить, если какая-либо команда перестала работать (путем возврата ненулевого состояния).Если у Вас есть GNU, находят (в особенности, если Вы работаете, не встроил Linux или Cygwin), существует другой подход к нахождению нового файла: иметь find
перечислите файлы и их даты и использование sort
и tail
извлечь самый молодой файл.
thefile=$(find -maxdepth 1 -type f -name "*Screen Shot*" -printf "%T@ %p" |
sort -k 1n | tail -n 1)
Если Вы готовы записать этот сценарий в zsh вместо удара, существует намного более легкий способ поймать новейший файл, потому что zsh имеет спецификаторы шарика, которые разрешают, чтобы подстановочный знак соответствовал не только на именах, но также и на метаданных файла. (om[1])
часть после шаблона является спецификаторами шарика; om
виды соответствуют путем увеличения возраста (т.е. ко времени изменения, новейшему первый) и [1]
извлекает первое соответствие только. Целое соответствие должно быть в круглых скобках, потому что это - технически массив, так как globbing возвращает список файлов, даже если [1]
средства, что в данном случае список содержит (самое большее) один файл.
#!/bin/zsh
set -e
cd ~/Desktop
thefile=(*"Screen Shot"*(om[1]))
echo "Most recent screenshot is: $thefile"
Если вы хотите сделать это с помощью многострочной/многострочной команды/с, вы можете сделать это:
output=$( bash <<EOF
#multiline/multiple command/s
EOF
)
Или:
output=$(
#multiline/multiple command/s
)
Пример:
#!/bin/bash
output="$( bash <<EOF
echo first
echo second
echo third
EOF
)"
echo "$output"
Выход:
first
second
third