last
читает файл /var/log/wtmp
. Обычно при выключении системы в этот файл записывается запись, указывающая на этот факт; то же самое происходит при загрузке системы для записи момента загрузки.
В вашем случае, по-видимому, запись о завершении работы не была записана в файл в последний раз, поэтому last
не может найти запись о завершении работы, совпадающую с записью загрузки, и пишет «все еще работает», как это обычно бывает в такая ситуация.
Я видел, как Debian-версия команды last
показывала «крах» в такой ситуации, возможно, версия Fedora считает это слишком тревожным, поскольку могут быть другие причины отсутствия записи.
git check-ignore.
завершится ошибкой с кодом выхода 128, если .
не находится в git
репозитории (или произойдет любая другая ошибка ), и с кодом выхода 1, только если путь не игнорируется. Таким образом, вы можете проверить только последнее:
git check-ignore -q. 2>/dev/null; if [ "$?" -ne "1" ]; then...
Внутри then
вы обрабатываете случай, когда .
игнорируется или отсутствует в репозитории git.
Чтобы это работало за пределами файловой системы, установите для GIT_DISCOVERY_ACROSS_FILESYSTEM
значение true
:
GIT_DISCOVERY_ACROSS_FILESYSTEM=true git check-ignore -q. 2>/dev/null; if [ "$?" -ne "1" ]; then...
Сначала должно быть:
if
git rev-parse --is-inside-work-tree >/dev/null 2>&1 &&
! git check-ignore. >/dev/null 2>&1
then...
Подстановка команд($(...)
)предназначена для извлечения вывода команды. Здесь нет вывода, поскольку вы перенаправляете его на /dev/null
, и если бы он был, он был бы воспринят как команда для выполнения (и проверки его статуса выхода ).
Обратите внимание, что вторая команда запускается только в случае успешного выполнения первой.
@StephenKitt показал, как разложить эти две команды на множители в одну git
команду , но если это по-прежнему не помогает с точки зрения производительности, вы всегда можете кэшировать информацию в ассоциативном массиве.
typeset -A is_git # declared globally in your ~/.zshrc
if (( ! $+is_git[$PWD] )); then
git check-ignore -q. 2> /dev/null
is_git[$PWD]=$(( $? == 1 ))
fi
if (( $is_git[$PWD] )); then...
Этот кеш может устареть, если вы переименуете каталоги, удалите .git
каталоги или измените список игнорируемых файлов. Вы можете аннулировать его с помощью is_git=()
или перезапустив zsh
с помощью exec zsh
.
Другим вариантом может быть проверка только при входе в каталог с помощью хука chpwd
:
check_git() {
git check-ignore -q. 2> /dev/null
(( is_git = $? == 1 ))
}
chpwd_functions+=(check_git)
А затем, в вашей быстрой рутине, это всего лишь вопрос:
if (( is_git )); then...