A melhor maneira de encurtar as opções de comando no * nix

2

Qual seria o melhor caminho no * nix (apelido, script, etc) para encurtar as opções disponíveis para um comando que não fornece um formato curto?

A idéia seria envolver o comando de alguma forma capaz de abreviar apenas a primeira opção. Além disso, permitindo usar os originais também.

Comando normal:

 > command option1 file.txt
 > command option2 file.txt

Usando o wrapper:

> command o1 file.txt
> command o2 file.txt

Aqui está um pseudocódigo para descrever uma possível solução que veio à minha mente usando um script de shell com o mesmo nome do comando e colocando-o primeiro no PATH.

 if $first_argument == "o1"
    call <command> option1 $additional_arguments
 else if $first_argument == "o2"
    call <command> option2 $additional_arguments
 else
    call <command> $first_argument $additional_arguments

Isso seria possível?

    
por df01 15.02.2011 / 17:46

3 respostas

4

Você pode criar aliases no seu arquivo ~ / .bashrc. Por exemplo, criar um arquivo com 7 zip de uma pasta, que normalmente seria

7z a -m0=lzma2 -mx=9 -ms=on -mf=on -mtc=on archive_name.7z folder_name

no seu ~ / .bashrc colocar em:

alias 7zipfolder='7z a -m0=lzma2 -mx=9 -ms=on -mf=on -mtc=on'

Depois disso, você pode fazer,

7zipfolder archive_name.7z folder_name

Terá de sair e voltar para que tenha efeito ou fonte ~ / .bashrc

HTH:)

==== EDIT: Considerando as respostas abaixo, bem, eu estou pensando que você poderia fazer isso se você modificar o PATH para procurar em suas pastas de script pessoais primeiro, como

PATH = ~ / .shortcommands: $ PATH

E então você pode criar scripts com os mesmos nomes daqueles que estão instalados, por exemplo, / usr / sbin, dê um loop sobre todos os argumentos, expanda os que você quer e, em seguida, termine chamando o script / aplicativo "real" em seu caminho absoluto com o conjunto de opções traduzido.

Por exemplo,

  7z --folder Documents.7z Documents/

chama

  ~/.shortcommands/7z

que traduz tudo para:

  /usr/bin/7z a -m0=lzma2 -mx=9 -ms=on -mf=on -mtc=on Documents.7z Documents/

O script em si seria repetir a lista de argumentos e depois traduzir o que faria sentido para as suas necessidades. Você provavelmente estará longe de ser capaz de criar um "shell" sobre o comando original, mas obviamente isso não é o que você está procurando. Não tenho certeza de como você é proficiente com scripts bash, mas há toneladas de recursos muito bons por aí. Apenas para servir de exemplo para a iteração de argumentos, aqui está um trecho de um script no qual estou trabalhando atualmente que cria / verifica dados de paridade e arquivos de soma de verificação para outros arquivos:

# Iterate arguments while shifting off those meant for us, leaving behind files to process.
# No clue how to directly index on the arguments array, so I copy it:
args=("$@")
files=()
files_count=0

# Then we iterate over each argument, collecting anything that's for us, and adding files
# to our files array, making sure to get absolute paths should we somehow get relative ones
# (e.g. from Nautilus or the commandline):
for ((i=0; $i<$#; i++)); do
        argument=${args[$i]}
        # How deep to go into FILE before starting to create/check protection files:
        if [ "$argument" = "-d" -o "$argument" = "--depth" ]; then
                # Seek to the next argument, i.e. the value:
                let "i=i+1"
                # We'll get an error if we try to just grab the next argument and it isn't there:
                if [ $i -eq $# ]; then
                        print_argument_error "${args[$i-1]} needs a value."
                else
                        target_depth="${args[$i]}"
                        # Okay, so is the value sane?
                        if [[ ! $target_depth =~ ^[1-9][0-9]{0,}$ ]]; then
                                print_argument_error "${args[$i-1]} must be 1 or higher."
                        fi
                fi
        # Whether or not to include output from our client commands, too:
        elif [ "$argument" = "-v" -o "$argument" = "--verbose" ]; then
                print_client_output=1
        # Whether or not to verify files:
        elif [ "$argument" = "-V" -o "$argument" = "--verify" ]; then
                check=1
        # Whether or not to create validation files:
        elif [ "$argument" = "-C" -o "$argument" = "--create" ]; then
                verify=1
        # Whether or not to repair files when possible:
        elif [ "$argument" = "-R" -o "$argument" = "--repair" ]; then
                verify=1
                repair=1
        # That's all the arguments we understand, the rest must be files:
        else
                # So we assume anything but an option is an input file or dir. Get the item:
                item="$argument"

                # If it's a file, we get its directory location and convert it to absolute,
                # then prepend the file name back onto that before pushing it onto our files
                # array. If it's a dir, we just convert it to absolute before pushing it:
                if [ -f "$item" ]; then
                        dir="'dirname "$item"'"
                        files[${files_count}]="'cd "$dir"; pwd'/'basename "$item"'"
                        let "files_count=files_count+1"
                elif [ -d "$item" ]; then
                        files[${files_count}]="'cd "$item"; pwd'"
                        let "files_count=files_count+1"
                fi
        fi
done
    
por 15.02.2011 / 18:09
1

Depende em parte de como o comando analisa suas opções. Para programas que são construídos usando a biblioteca de análise de argumento popt, existe um mecanismo de aliasing embutido, onde é possível criar opções de alias que se expandem para opções existentes, usando um arquivo rc em seu diretório pessoal. Infelizmente, a documentação popt não é exatamente voltada para usuários finais, mas para desenvolvedores que querem usar a biblioteca em seus programas. No entanto, informações sobre /etc/popt e ${HOME}/.popt podem ser encontradas na seção manual 3 page for popt na seção Option Aliasing .

Isso só se aplica a programas criados para usar o popt, claro. Como mencionado acima, não há mecanismo universal, porque não existe um mecanismo de análise de argumentos usado por todos os programas. Scripts e aliases de invólucros são os recursos para programas em que não existe um mecanismo de aliasing de opções popt ou popt disponível.

    
por 22.02.2011 / 16:48
0

É isso para facilitar a digitação? Você pode querer verificar Conclusão da Linha de Comando Programável . Pode tornar sua digitação mais eficiente.

    
por 22.02.2011 / 17:35