У Вас есть две основных проблемы.
Первая проблема - то, что происходит в самой первой команде: test ! -f ~/TAM/dustbin/*
. Сначала оболочка разворачивает подстановочный шаблон ~/TAM/dustbin/*
, затем это передает получающийся список test
команда. Это не будет работать, если будет больше чем один файл соответствия.
С любой оболочкой стиля Границы можно сохранить список соответствий в позиционных параметрах и проверить, существует ли первое слово (если это не делает, шаблон ничему не соответствовал).
set ~/TAM/dustbin/*
if ! test -f "$1"; then
echo "this directory is empty"
…
(См. этот ответ для способов заставить шаблон шарика несоответствия расшириться до пустого списка в ksh, ударе и zsh.)
Обратите внимание, что каталог не может быть пустым: это может содержать точечные файлы (файлы, имя которых начинается .
, который подстановочный шаблон *
пропуски. Если Вы хотите проверить на существование точечных файлов также, самый легкий портативный путь состоит в том, чтобы сделать это с find
:
if [ "$(cd ~/TAM/dustbin && find . | head -n 1)" = "." ]; then
echo "this directory is empty"
else
set ~/TAM/dustbin/..?* ~/TAM/dustbin/.[!.]* ~/TAM/dustbin/*
for x; do
if [ -f "$x" ]; then
# $x is a regular file
elif [ -e "$x" ]; then
# $x is a directory or other special file
else
# $x is an unexpanded non-matching pattern
fi
done
fi
(Отметьте это test -f
только соответствия регулярные файлы; использовать -e
протестировать, существует ли файл.)
Другая распространяющаяся проблема в Вашем сценарии состоит в том, что Вы не защищаете от имен файлов, содержащих специальные символы оболочки. Всегда используйте двойные кавычки вокруг подстановок переменных "$foo"
и замены команды "$(foo)"
. Ваш сценарий может дросселировать или удалить неправильный файл, если имя файла содержит пробел или \[?*
.
Я предполагаю, что это - осуществление изучения. Если это не:
#!/bin/bash
setopt nullglob
rm -ri ~/TAM/dustbin/*
Это ошибка.
Похоже, что "правильной" визуализацией является та, что слева, где жирный шрифт не отображается. Насколько я могу понять (здесь есть ссылка), атрибут bold изначально использовался для установки выделенной версии 8 базовых цветов.
Исторически сложилось так, что между полужирными версиями 8 цветов ANSI по умолчанию и яркими версиями 8 цветов по умолчанию существует соответствие один к одному. В те времена, когда цветная программа требовала отображения жирного текста, эмуляторам терминалов, вероятно, было проще отобразить более яркую версию любого цвета текста (и ожидать, что пользователь интерпретирует это как жирный), чем отображать шрифт с жирным начертанием.
По сути, здесь происходит то, что для использования полной Solarized палитры, с оранжевым, пурпурным и всеми уровнями серого, цвета вызываются с атрибутом bold, который в свою очередь ссылается на альтернативные 8 цветов палитры ANSI.
Terminal понимает это правильно и показывает оранжевый и комментарий серый в нормальном наборе, тогда как tmux добавляет к ним ненужный жирный шрифт. В итоге, левая сторона является правильной, а правая - нет.
Есть ли способ отключить жирный шрифт в tmux?
Мне все еще нужно провести некоторые исследования по этому вопросу, и я обновлю этот ответ, как только найду что-нибудь.
А вот и решение! :)
Чтобы tmux вел себя правильно, мы должны вызвать его, сказав ему, что мы находимся в среде с поддержкой 256 цветов.
TERM=xterm-256color /usr/bin/tmux
Для удобства мы можем alias
это сделать (т.е. добавить alias tmux="<строка выше>"
в ваш ~/.bashrc
).
Вызов tmux
как tmux -2
, заставляющий tmux работать с поддержкой 256 цветов (вместо переопределения переменной окружения TERM
), не позволит правильно интерпретировать "полужирную альтернативу" 8 цветов (т.е. более яркий вариант также будет иметь полужирный шрифт). Поэтому я настоятельно рекомендую использовать приведенное здесь решение для правильной интерпретации 256 цветов и и нежирных "жирных альтернативных" цветов.