Aliases de Bash / funções e opções de linha de comando

3

Eu quero definir um alias para iniciar o nedit junto com a opção de linha de comando -noautosave (devido a arquivos de texto de até 500MB). O que parecia ser fácil:

alias nn="nedit -noautosave $1 &"

apenas gera algum erro "Permissão negada" de um arquivo diferente e outro erro sobre EOF inesperado ao procurar correspondência entre "'" e "fim inesperado de arquivo ".

Uma solução que encontrei depois de uma Pesquisa do Google seria verificar as cotações, mas não consigo ver nenhum possível erro com elas.

Eu também tentei declarar uma função:

function nn () { nedit -noautosave $1 &}

que também falhou com os mesmos erros.

    
por Soum Vhon 05.09.2013 / 11:18

4 respostas

2

Se você deseja executar apenas nedit com -noautosave quando um dos arquivos a serem abertos for maior que um determinado tamanho, tente isto (estou usando 100M, mas você pode definir seu próprio limite de tamanho):

function nn() { 
    big=0;
    let big+=$(find "$@" -size +100M|wc -l)
    if [ $big -gt 0 ]; then
     nedit -noautosave -- "$@" &
    else
     nedit -- "$@" &
    fi
}

De man nedit :

   --  Treats all subsequent arguments as file names,
       even if they start with a dash.  This is so NEdit
       can access files that begin with the dash
       character.
    
por 05.09.2013 / 14:52
2

Você não pode transmitir argumentos para um alias . Você terá que usar um function , então você estava no caminho certo. Você acabou de ter um erro de digitação no uso do comando function . Qualquer um desses fará, no entanto:

$ nn () { nedit -noautosave -- "$@" & }

-ou -

$ function nn() { nedit -noautosave -- "$@" & }

Se você precisar removê-lo, use o comando unset , por exemplo, unset -f nn .

Além disso, usaria "$@" em vez de $1 , caso você queira abrir uma série de arquivos dessa maneira.

excerto da página de manual bash

@      Expands to the positional parameters, starting from one.  When the 
       expansion occurs within double quotes, each parameter expands to a 
       separate word.  That is, "$@" is equivalent  to  "$1" "$2" ...  If 
       the double-quoted expansion occurs within a word, the expansion of 
       the first parameter is joined with the beginning part of the original 
       word, and the expansion of the last parameter is joined with the last
       part of the original word.  When there are no positional parameters,
       "$@" and $@ expand to nothing (i.e., they are removed).

Exemplo

$ function nn() { nedit -noautosave -- "$@" & }

$ nn ~/.bashrc 
[3] 19830
    
por 05.09.2013 / 11:39
1

Se o objetivo do alias for aplicar a opção -noautosave a qualquer arquivo editado,

alias nn='nedit -noautosave'

deve ser o suficiente. Você pode então usá-lo como

nn your_file &
    
por 05.09.2013 / 12:45
1
alias nn="nedit -noautosave $1 &"

A expansão da variável é interpretada dentro de aspas duplas. Se você executou isso de seu .bashrc ou na linha de comando do seu shell, não havia parâmetros posicionais (eles seriam os parâmetros passados ao shell), então $1 expandiu para a string vazia, e o valor do alias é nnedit -noautosave & . Portanto, quando você executou nn /path/to/file.txt , isso foi expandido para nnedit -noautosave & /path/to/file.txt . A mensagem de erro "Permissão negada" foi porque /path/to/file.txt não é executável.

Você poderia ter usado alias nn='nedit -noautosave $1 &' para impedir a expansão e reter $1 dentro do alias. No entanto, isso não funcionaria melhor, porque os aliases não recebem argumentos, eles são substituídos no lugar. Portanto, $1 teria sido substituído pelo primeiro parâmetro posicional no momento em que o alias foi expandido, o que não é melhor do que antes.

function nn () { nedit -noautosave $1 &}

Isso é basicamente correto. Se você tiver os mesmos erros de antes, é porque o alias nn ainda estava definido e um alias tem precedência sobre uma função com o mesmo nome. Use unalias nn para indefinir o alias.

A função deve ser escrita desta maneira:

function nn () { nedit -autosave "$@" & }

As aspas duplas são necessárias no caso de haver espaços ou caracteres curinga no nome do arquivo. Usar "$@" em vez de "$1" permite passar vários argumentos.

    
por 05.09.2013 / 23:40