Взгляните на это сообщение в блоге, дающее много примеров о том, как настроить привязки клавиш GTK через ~/.gtkrc-2.0
. Это должно сделать то, что Вы предназначаете,
binding "gtk-binding-widget" {
bind "m" { "popup-menu" () }
}
class "GtkWidget" binding "gtk-binding-widget"
путем привязки m к контекстному меню. (Однако я просто попробовал его Firefox, и это не работало... Никакой наутилус для тестирования его, извините.) Вы могли попробовать другие классы, также.
Fro первый вопрос, в основном, Вы даете слишком много параметры test
там (мне кажется, что первая строка того, что Вы вставили, является на самом деле 4-й строкой Вашего сценария). Если Ваш случай нескольких файлов, Вы будете иметь test -f file1 file2 file3…
в то время как test
ожидал бы бинарного оператора (например, "-a" для И) после -f file1
и следующее выражение после этого и так далее.
Что касается предоставления и обработки параметров для Вашего сценария для автоматического удаления файлов, не прося подтверждение можно использовать то же test
на 1$ (это будет первым параметром командной строки Вашего сценария).
У Вас есть две основных проблемы.
Первая проблема - то, что происходит в самой первой команде: 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/*
#!/bin/bash
dir="$HOME/TAM/dustbin"
# check if the dir is empty
shopt -s nullglob
files=("$dir"/*)
if (( ${#files[@]} == 0 )); then
echo "the directory is empty"
exit
fi
# handle command line arguments
all=false
while getopts :a opt; do
case $opt in
a) all=true ;;
?) echo "unknown option: -$OPTARG"; exit 1 ;;
esac
done
shift $((OPTIND - 1))
# perform the deletion
if $all; then
command rm "$dir"/*
else
command rm -i "$dir"/*
fi