1

в моем .bash_profile у меня есть дополнительная команда:

trash () { command mv "$@" ~/.Trash ; }

Это в основном сейфе rm К сожалению, sudo не работает на этом. Я искал исправление для этого и добавил alias sudo='sudo ' в мой .bash_profile, и хотя он работает с каждым имеющимся у меня псевдонимом, вы можете видеть, что это настраиваемая команда / функция, и если я использую свой теперь "настраиваемый" sudo на этом я получаю это:

sudo: trash: command not found

Кто-нибудь знает решение для этого?

Я использую MacOS Mojave.

3 ответа3

0

Вот небольшое изменение в вашем запросе, которое хорошо работает на моей старой OS X:

trash(){ x=''; [[ $1 = s ]] && { x=sudo; shift; }; $x mv "$@" ~/.Trash; }

Без sudo:

мусорный файл-1, файл-2 и т. д.

С sudo:

мусор с файл-1 файл-2 и т. д.

0

В этом случае вы хотите, чтобы ваша функция bash по сути работала как отдельный скрипт. Использование его как bash_alias не работает, потому что sudo не знает об этом. Когда вы выполняете sudo trash somefile , он ищет этот скрипт в /root/.bash_alias , а не /home/youruser/.bash_alias . Поскольку эта функция существует только как bash_alias в домашнем каталоге вашего пользователя, sudo/root говорит, что ее не существует. Все, что вам нужно сделать, это сделать вашу функцию доступной для всех пользователей, включая sudo (root).

Вы можете обойти это, либо добавив свой псевдоним в конец вашего файла /etc/profile который будет информировать всех пользователей о функции, либо вы можете создать bash-скрипт в /usr/bin/trash для выполнения тех же самых важных задач. функция. В более позднем сценарии вы также захотите выполнить команду sudo chmod 755 /usr/bin/trash чтобы все пользователи могли выполнять программу.

В любом случае, в любом случае будет работать, но я предлагаю метод /etc /profile, так как это просто простая функция псевдонима для перемещения файлов в корзину. Нет причин ограничивать это для других пользователей. Всегда не забывайте учитывать последствия для безопасности, связанные с созданием bash_alias для всех пользователей.

Надеюсь, это поможет. :)

0

Похоже, что нет простого решения, возможно, потому что sudo может быть довольно опасным и имеет некоторые строгие меры безопасности. Но несколько более сложных решений могут быть:

  • С небольшой дополнительной работы, вы могли бы использовать , чтобы declare "восстановить" функцию в SUDO [ источник ]:

       function hello()
        {
            echo "Hello!"
        }
    
        FUNC=$(declare -f hello)
        sudo bash -c "$FUNC; hello"
    

    Или проще:

        sudo bash -c "$(declare -f hello); hello"
    

    Но я думаю, что у вас будут некоторые проблемы с получением аргументов для функции, поэтому в этом случае вам придется использовать другой ответ ниже.

  • Этот ответ выглядит интересно:

    Я написал для этого собственную функцию Sudo bash, она работает для вызова функций и псевдонимов:

    function Sudo {
    local firstArg=$1
    if [ $(type -t $firstArg) = function ]
    then
      shift && command sudo bash -c "$(declare -f $firstArg);$firstArg $*"
    elif [ $(type -t $firstArg) = alias ]
    then
      alias sudo='\sudo '
      eval "sudo $@"
    else
      command sudo "$@"
    fi
    }
    
  • Если вместо этого вы можете использовать su , он должен поддерживать экспортированные функции [ source ]:

    your_function () { echo 'Hello, World'; }
    export -f your_function
    su -c 'your_function'
    
  • Если вы уже переместили функцию в собственный исполняемый файл, это возможно (вероятно?) у этого sudo нет того же $PATH что и у вашего интерактивного терминала, поэтому вам может потребоваться отредактировать файл /etc/sudoers или сделать это [ source:

    Дайте sudo ваш текущий PATH с:

    sudo env "PATH=$PATH" your_command
    

    Или в псевдониме: alias sudo='sudo env "PATH=$PATH" '

  • Я думаю, что вы могли бы даже поставить весь ваш .bash_profile с помощью sudo, интегрированного в один из ответов выше.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .