web-dev-qa-db-ja.com

デフォルトのテキストエディターでテキストファイルを開くシェルスクリプトの許可をbashが拒否するのはなぜですか?

私は: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ターミナルで編集のためにnew_note.txtを開くテキストエディター

elseステートメントは機能しますが、./note.sh edit new_noteは戻ります

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

タッチは行いますが、エディターは行いません。ここで許可が拒否されているのは何ですか?

前もって感謝します!私はシェルスクリプトとaskubuntuの両方に非常に慣れていないので、助けていただければ幸いです

5
Oreoplasm

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

お役に立てれば!

11
Terrance

$EDITOR変数は設定されていないため、その行に到達すると空白になります。 bash~/.notes/"$2".txtを残して呼び出します。
そのため、bash/home/username/.notes/testnote.txtを実行しようとします。これは、ファイルに実行可能フラグが設定されていないため、permission deniedになります。

Terranceが既に述べたように、コマンドeditorを直接呼び出すか、有効なテキストエディターを変数$EDITORに割り当てます。

EDITOR="/usr/bin/vi"

または

EDITOR="/usr/bin/vim"

または

EDITOR="/bin/nano"

または選択した他のエディター。

6
Thomas

簡単に:Debian/Ubuntuの場合:sensible-editorを実行します。


しかし、表示されるエラーについて:

他の人が述べたように、EDITORが空であるか設定されていない場合、$EDITORの引用符なしの展開は何も生じません。

quoted展開"$EDITOR"は空のWordになり、シェルがコマンドとして空の文字列を実行しようとすると、混乱を招くエラーが発生します。

bash: : command not found

EDITORが設定されていない場合に、おそらくフォールバックを設定する必要があります。そのために${par:-Word}拡張を使用できます。例えば。 "${EDITOR:-vi}"EDITORの値を使用し、空または未設定の場合はviにフォールバックします。

次に、VISUALもあります。これはほとんど同じ機能を提供するため、両方を確認できます:"${VISUAL:-${EDITOR:-vi}}"


buntuおよび他のDebianベースのシステムでは、sensible-editorを使用する必要がありますeditorviまたはnanoの代わりに)ユーザーごとにを許可しているためデフォルトエディターの設定update-alternativesによって設定されるシステム全体のシンボリックリンクに依存するeditorとは異なります。

sensible-editorVISUALEDITORもチェックするため、それらを明示的にチェックする必要はありませんが、sensible-editor $fileを実行するだけで適切に処理されます。

(たとえあなたのシステムがシングルユーザーシステムであっても、マルチユーザーシステムが存在し、デスクトップマシン上でも複数のユーザーを持つことができることに留意してください。)

0
ilkkachu