Оба резервного хранилища и сохранения в являются атрибутами/флагами, которые можно установить при создании окна с помощью XCreateWindow()
. Тем не менее, это всего лишь подсказки для сервера X11, они не включены по умолчанию и на самом деле не стоят проблем с современным оборудованием.
Как правило, когда (часть )фонового окна становится видимой, сервер X11 отправляет событие Expose
клиенту X11, что должно привести к его перерисовке. Поскольку это всего лишь подсказки, сервер X11 может по-прежнему отправлять Expose
, даже если клиент установил как .backing_store = Always
в окне, так и CWSaveUnder
во всплывающих окнах, которые он открывал поверх него.
Существуют также интерфейсы, которые позволяют клиенту запрашивать, реализует ли сервер резервное хранилище и сохранение в:XDoesBackingStore()
и XDoesSaveUnders()
.
Оконный менеджер не имеет ко всему этому никакого отношения; он не перерисовывает никаких окон (, кроме собственных :заголовков, кнопок закрытия ).
Просто используйте глобальную опцию-C
дляgit
. Делая это и упрощая свой код (, зачем вам анализировать вывод для восстановления информации, которая непосредственно закодирована в статусе возврата?):
directory=. # or wherever
if git -C "$directory" rev-parse --is-inside-work-tree >/dev/null 2>/dev/null; then
echo yes
fi
Я подозреваю, что самый простой вариант — временно перейти в каталог:
(cd /path/to/target && [[ $(git rev-parse --is-inside-work-tree) == true ]]) 2> /dev/null && echo yes
Я бы сделал это с помощью функции, которая перемещается в целевой каталог, запускает там команду и возвращает результат:
isGitDIr(){
for dir in "$@"; do
(
cd "$dir" || return
[[ $(git rev-parse --is-inside-work-tree 2> /dev/null) == true ]] &&
echo "yes"
)
done
}
Круглые скобки заставляют команды выполняться в подоболочке, поэтому, когда функция завершится, вы не изменили каталог родительской оболочки. Добавьте строки в файл инициализации вашей оболочки (, например.~/.bashrc
)или вставьте прямо в свой терминал, и вы можете сделать:
isGitDIr /path