我一直在尝试使用终端打开 gedit 与它能够使用的任何类型的文件,并且在文件关闭或终端输出中有任何错误消息之前不会阻止终端。
本质上的区别:
/dev/null
or
>/dev/null
这会通过终端打开一个文本文件,不会锁定它,也不会显示任何错误消息。
function gedit {
sudo -H gedit "$@" /dev/null 2>&1 &
clear;
}
这不起作用,与上述方法相反。
function gedit {
sudo -H gedit "$@" >/dev/null 2>&1 &
clear;
}
有什么想法吗?
问题可能是几件事,因为您将所有错误输出到
/dev/null
,您将无法读取这些错误。我建议在
-H
您打算执行特权的命令之前移动标志。我觉得sudo
对这些东西很挑剔。(即:)sudo -H COMMAND_HERE
。您当前的 shell 可能尚未升级到
sudo
,并且您被要求输入密码。您可以尝试发出
sleep 0
或echo
只是获得 sudo 提示。如果您已经输入了密码,那么这应该仍然有效。或者,如果您已
gedit
在 中设置sudoers
,则可以删除该sudo sleep 0
行,但无论哪种方式,您都需要-H
修复sudo
.为了了解终端窗口中的命令在做什么,您需要从基本的 shell 语法开始。这个
>
角色有一个非常特殊的功能,因此它的存在在那个层面上产生了根本性的差异。首先是一个基本点:
sudo
像这样不加选择地添加是危险的,我建议不要这样做。如果隐藏在函数中,很容易忘记您正在使用root
特权。sudo
在您的第一个版本中:
该
sudo
命令使用-H
选项调用,参数gedit "$@" /dev/null
where"$@"
被传递给函数的参数列表替换。因此gedit
,以用户身份运行,root
其中包含要编辑的文件列表,其中包括用户提供的所有文件以及文件/dev/null
。(编辑是否/dev/null
有意义超出了这个解释的范围。)2>&1
这个版本中的元素什么都不做,因为标准输出和标准错误已经到了同一个目的地。该元素&
将整个命令置于后台,以便再次释放终端窗口。因此,如果他们尝试将任何内容写入标准输出或标准错误,它将导致sudo
或阻止。gedit
在您的第二个版本中:
该
sudo
命令使用-H
选项调用,参数gedit "$@"
where"$@"
被传递给函数的参数列表替换,如前所述。因此gedit
,以用户身份运行,root
并具有用户给出的要编辑的文件列表。该元素>
将命令的标准输出重定向到以下文件/dev/null
,有效地丢弃它,并且该元素2>&1
将标准错误重定向到相同的目的地。该元素&
像以前一样将整个命令置于后台,但由于这次标准输出和标准错误已被重定向,因此程序不会阻止在那里写入。一旦您了解了基本的功能差异,您就可以开始分析每个版本的行为方式为何以及如何改变您不喜欢的行为。例如,
sudo
可能会尝试提示输入与放入后台冲突的密码。如果你想坚持sudo
反对我的建议,有一些方法可以解决这个问题,方法是sudo
通过-v
and-n
选项将密码检查和程序运行步骤分开。