Удалите застрявший сценарий оболочки Linux

Взгляните на это сообщение в блоге, дающее много примеров о том, как настроить привязки клавиш GTK через ~/.gtkrc-2.0. Это должно сделать то, что Вы предназначаете,

binding "gtk-binding-widget" {
    bind "m" { "popup-menu" () }
}
class "GtkWidget" binding "gtk-binding-widget"

путем привязки m к контекстному меню. (Однако я просто попробовал его Firefox, и это не работало... Никакой наутилус для тестирования его, извините.) Вы могли попробовать другие классы, также.

2
21.11.2012, 14:01
3 ответа

Fro первый вопрос, в основном, Вы даете слишком много параметры test там (мне кажется, что первая строка того, что Вы вставили, является на самом деле 4-й строкой Вашего сценария). Если Ваш случай нескольких файлов, Вы будете иметь test -f file1 file2 file3… в то время как test ожидал бы бинарного оператора (например, "-a" для И) после -f file1 и следующее выражение после этого и так далее.

Что касается предоставления и обработки параметров для Вашего сценария для автоматического удаления файлов, не прося подтверждение можно использовать то же test на 1$ (это будет первым параметром командной строки Вашего сценария).

1
27.01.2020, 22:14

У Вас есть две основных проблемы.

Первая проблема - то, что происходит в самой первой команде: 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/*
1
27.01.2020, 22:14
#!/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
0
27.01.2020, 22:14

Теги

Похожие вопросы