Por que o bash está negando a permissão do shell script para abrir um arquivo de texto com o editor de texto padrão?

5

Estou em:  GNU bash, versão 4.4.12 (1) -release (x86_64-pc-linux-gnu)

o script é: (note.sh)

 #! /bin/bash

edit="edit"

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

Eu estava esperando se eu entrar no bash:     %código% Eu recebo saída como se eu tivesse digitado     %código% Mas eu quero que esse script basicamente aceite argumentos, então se eu inserir     %código% então se new_note.txt não existir,     %código% então (Gedit para mim) editor de texto abrindo new_note.txt no terminal para edição

a instrução else funciona, mas ./note.sh retorna

tree ~/.notes

Faz o toque, mas não o editor. O que está sendo negado permissão aqui?

Obrigado antecipadamente! Eu sou muito novo para ambos os shell de script e askubuntu e muito aprecio qualquer ajuda

    
por Oreoplasm 17.02.2018 / 16:48

3 respostas

11

No bash, a variável $EDITOR não está definida por padrão. No entanto, existe um comando que chama o editor padrão.

Para este comando é:

editor <filename>

Para definir o comando à sua escolha:

sudo update-alternatives --config editor

Exemplo:

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:

Depois de escolher seu editor padrão, tudo o que você precisa fazer para chamá-lo em seu script é:

editor ~/.notes/"".txt

Espero que isso ajude!

    
por Terrance 17.02.2018 / 17:00
6

A variável $EDITOR não está definida, por isso, fica em branco ao atingir essa linha. Deixando ~/.notes/"".txt para bash para chamar.
Por isso, bash tenta executar /home/username/.notes/testnote.txt , o que concede permissão negada porque não há sinalizador de executável definido para o arquivo.

Como Terrance já mencionou, chame o comando editor diretamente ou atribua um texteditor válido à variável $EDITOR .

EDITOR="/usr/bin/vi"

ou

EDITOR="/usr/bin/vim"

ou

EDITOR="/bin/nano"

ou qualquer outro editor de sua escolha.

    
por Thomas 17.02.2018 / 16:57
0

Em resumo : No Debian / Ubuntu: execute sensible-editor .

Mas sobre o erro que você vê:

Como outros mencionaram, se EDITOR estiver vazio ou não definido, a expansão sem aspas de $EDITOR resultará em nada, então o que a shell vê como a primeira palavra na linha e como o comando é o nome do arquivo que vem depois.

Uma expansão citada "$EDITOR" resultaria em uma palavra vazia, o que lhe daria um erro confuso quando o shell tentasse executar uma string vazia como um comando:

bash: : command not found

Você provavelmente deseja definir um fallback no caso EDITOR não está definido. Você pode usar a expansão ${par:-word} para isso. Por exemplo. "${EDITOR:-vi}" usaria o valor de EDITOR e, se estiver vazio ou não definido, voltará a vi .

Depois, há também VISUAL , que serve basicamente a mesma função, então você pode verificar ambos: "${VISUAL:-${EDITOR:-vi}}" .

No Ubuntu e em outros sistemas baseados em Debian, você deve usar sensible-editor (em vez de editor , vi ou nano ) pois permite um por -user configuração do editor padrão , ao contrário de editor , que depende do link simbólico para todo o sistema definido por update-alternatives .

sensible-editor também verifica VISUAL e EDITOR , portanto, você não precisa verificá-los explicitamente, mas pode executar apenas sensible-editor $file e fará a coisa certa.

(Mesmo que o seu sistema seja de usuário único, é bom ter em mente que existem sistemas multiusuário e que você pode ter vários usuários, mesmo em uma máquina desktop.)

    
por ilkkachu 18.02.2018 / 12:35