在我的 .bash_profile 中我有额外的命令:
trash () { command mv "$@" ~/.Trash ; }
它基本上是我的保险箱rm
。不幸的是,sudo
它不能用。我找到了一个解决办法,并把它添加alias sudo='sudo '
到我的 .bash_profile 中,虽然它可以与我拥有的每个别名一起使用,但正如你所见,它是一个自定义命令/函数,如果我使用我现在的“自定义”,sudo
我会得到这个:
sudo: trash: command not found
有人知道如何解决这个问题吗?
我正在运行 MacOS Mojave。
答案1
看起来没有简单的解决方案,也许是因为 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
,它应该支持导出函数[来源]:your_function () { echo 'Hello, World'; } export -f your_function su -c 'your_function'
如果您已经将该功能移至其自己的可执行文件,则 sudo 可能(很可能?)与您的交互式终端不同
$PATH
,因此您可能需要编辑/etc/sudoers
文件,或者执行以下操作[来源:使用以下命令为 sudo 指定当前 PATH:
sudo env "PATH=$PATH" your_command
或者使用别名:
alias sudo='sudo env "PATH=$PATH" '
我认为你甚至可以
.bash_profile
用 sudo 来获取你的整体,并将其集成到上面的一个答案中。
答案2
以下是对您的请求的细微更改,它在我的旧 OS X 上运行良好:
trash(){ x=''; [[ $1 = s ]] && { x=sudo; shift; }; $x mv "$@" ~/.Trash; }
不使用 sudo:
垃圾文件-1文件-2等
使用 sudo:
垃圾文件 s 文件-1 文件-2 等等
答案3
在这种情况下,您希望您的 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 可供所有用户使用的安全隐患。
希望有所帮助。:)