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