препятствуйте тому, чтобы завершение удара изменило $ переменной подчеркивания _

В то время как -f средства вызывают на всех них, для cp, это означает силу путем попытки удалить место назначения сначала, если место назначения не может быть обновлено.

Для mv и rm, -f просто переопределения -i. Но для cp, это изменяет поведение утилиты, -f не противоположность -i в этом случае, cp -i -f имеет смысл и средства, если цель существует, спросите пользователя и если это не может быть переопределено, удалите его сначала.

Даже для mv и rm, добавление -f не то же как удаление -i когда дело доходит до предупреждающих сообщений и сообщений об ошибках, отправленных пользователю. Например, rm non-existent-file сообщила бы ошибка в то время как rm -i -f non-existent-file не был бы.

Как уже упомянуто, для удаления эффекта -i, вместо добавления -f, необходимо отключить псевдоним с помощью любого из предоставленных решений.

1
13.10.2013, 18:33
1 ответ

Вы используете bash-completion пакет (или производная). Для каждого завершения аргумента cd команда (как показано complete -p вывод):

complete -o nospace -F _cd cd

_cd функция вызывается для определения завершений (немного отредактированный для краткости):

_cd()
{
    local cur prev words cword
    _init_completion || return

    local IFS=$'\n' i j k

    compopt -o filenames

    if [[ -z "${CDPATH:-}" || "$cur" == ?(.)?(.)/* ]]; then
        _filedir -d
        return 0
    fi
    ....

Так, например, когда Вы завершаетесь на каталоге без CDPATH набор, замеченный в последний раз аргумент замеченной команде -d, и это помещается автоматически в _. Существует несколько других путей выполнения кода в той функции с подобными побочными эффектами.

С тех пор _ внутренний удар, стандартное сохраняют/восстанавливают (что касается IFS) не будет работать, как надеялся. Вы могли сделать это с небольшим обманом:

_cd()
{
    local save_="$_"
    ...
    : $save_
    return 0

Необходимо сохранить _ сразу на записи в функцию, : пустая команда, которая не делает ничего серовато-синего, но имеет обычные побочные эффекты команды, такие как установка _. Эта операция восстановления будет требоваться для каждой точки возврата каждой потенциально разрушительной функции. Существует тонкость здесь также: обычно _ сразу установлен после возврата из функции (к последнему аргументу вызова функции, как ожидалось), который сделал бы этот метод неэффективным. Но, этого не происходит, когда функция завершения вызывается, так как это не явно вызванный. Я не полагаю, что это очень устойчиво...

(Я предпочитаю расширение истории и придерживаюсь !$ который не переносит эту проблему.)

2
27.01.2020, 23:39

Теги

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