为什么 bash 拒绝我的 shell 脚本使用默认文本编辑器打开文本文件的权限?

为什么 bash 拒绝我的 shell 脚本使用默认文本编辑器打开文本文件的权限?

我位于:GNU bash,版本 4.4.12(1)-release (x86_64-pc-linux-gnu)

脚本是:(note.sh)

 #! /bin/bash

edit="edit"

if [[ $edit = $1 ]]
then
    touch ~/.notes/"$2".txt
    $EDITOR ~/.notes/"$2".txt
else
    tree ~/.notes
fi

我希望如果我在 bash 中输入: ./note.sh 我会得到像我输入一样的输出 tree ~/.notes 但我希望这个脚本基本上接受参数,所以如果我输入 ./note.sh edit new_note 那么如果 new_note.txt 不存在, touch ~/.notes/new_note.txt 那么(对我来说是 Gedit)文本编辑器在终端中打开 new_note.txt 进行编辑

else 语句有效,但 ./note.sh edit new_note返回

./note.sh: line 10: /home/username/.notes/testnote.txt: Permission denied

它确实可以触摸,但不能编辑。这里拒绝了什么权限?

提前致谢!我对 shell 脚本和 askubuntu 都很陌生,非常感谢任何帮助

答案1

在 bash 中,默认情况下不设置该变量$EDITOR。但是,有一个命令可以调用默认编辑器。

对于这个命令它是:

editor <filename>

要将命令设置为您的选择:

sudo update-alternatives --config editor

例子:

terrance@terrance-ubuntu:~$ sudo update-alternatives --config editor
There are 3 choices for the alternative editor (providing /usr/bin/editor).

  Selection    Path               Priority   Status
------------------------------------------------------------
  0            /bin/nano           40        auto mode
  1            /bin/ed            -100       manual mode
  2            /bin/nano           40        manual mode
* 3            /usr/bin/vim.tiny   10        manual mode

Press <enter> to keep the current choice[*], or type selection number:

选择默认编辑器后,您只需在脚本中调用它即可:

editor ~/.notes/"$2".txt

希望这可以帮助!

答案2

$EDITOR变量未设置,因此到达该行时它是空白的。离开~/.notes/"$2".txtbash调用。
然后bash尝试执行/home/username/.notes/testnote.txt,结果为没有权限因为该文件没有设置可执行标志。

正如 Terrance 已经提到的,直接调用命令editor或为变量分配一个有效的文本编辑器$EDITOR

EDITOR="/usr/bin/vi"

或者

EDITOR="/usr/bin/vim"

或者

EDITOR="/bin/nano"

或您选择的任何其他编辑器。

答案3

简单来说:在 Debian/Ubuntu 上:运行sensible-editor


但是您看到的错误是:

正如其他人提到的,如果EDITOR为空或未设置,则不带引号的扩展$EDITOR不会产生任何结果,因此 shell 会将其视为行中的第一个单词,而命令则是后面的文件名。

A扩展"$EDITOR"将导致一个空字,当 shell 尝试运行空字符串作为命令时,这将导致令人困惑的错误:

bash: : command not found

EDITOR您可能希望在未设置的情况下设置回退。您可以使用${par:-word}扩展来实现这一点。例如,"${EDITOR:-vi}"将使用 的值EDITOR,如果它为空或未设置,则回退到vi

然后还有VISUAL,它的功能几乎相同,因此您可以检查两者:"${VISUAL:-${EDITOR:-vi}}"


在 Ubuntu 和其他基于 Debian 的系统上,你应该使用sensible-editor(而不是editorvinano因为它允许每个用户默认编辑器的设置,与 不同editor,它取决于 设置的系统范围的符号链接update-alternatives

sensible-editor还检查VISUALEDITOR,所以您不需要明确检查它们,而只需运行sensible-editor $file它就会做正确的事情。

(即使您的系统可能是单用户系统,也请牢记多用户系统确实存在,即使在台式机上也可以有多个用户。)

相关内容