Como posso passar argumentos de linha de comando para um script através do Dash? (14,04)

8

Recentemente, fiz esta pergunta sobre como adicionar um script de shell ao Dash:

Na 14.04, como executo um script bash que escrevi sem abrir um terminal?

Funcionou perfeitamente.

Pergunta de acompanhamento: Como transmitir argumentos da linha de comando através do Dash? Exemplo: Nesse caso, meu comando dash é chamado "Painel". O script apainela minha tela com 8 terminais. Aqui está um exemplo do uso:

panel             # Tile the screen with 8 terminal windows.
panel --left      # Tile the left side with 4 terminals
panel --right     # Tile the right side with 4 terminals

E assim por diante. Como posso passar argumentos como --leftou --rightatravés do Dash? Idealmente, eu gostaria de ter este fluxo de trabalho:

  • Pressione a tecla SUPER
  • Digite panel --left(por exemplo)
  • Dash desaparece e o lado esquerdo é revestido com painéis.

No momento, ele executa o script certo, mas ignora --left.

Dicas?

Sir Robert
fonte
possível duplicata de especificar os parâmetros para programa de lançador
Radu Rădeanu
1
@ RaduRădeanu: Obrigado, mas isso definitivamente não é uma duplicata disso. Isso mostra como afixar opções permanentemente em um programa iniciador. Quero poder usar opções diferentes sempre que quiser (sem ter várias versões do iniciador).
Sir Robert
5
Por que não usar apenas Alt + F2? Isso provavelmente seria mais fácil .. Outra opção seria a criação de arquivos .desktop separados ..
Seth
1
... ou um arquivo .desktop com uma lista rápida do iniciador.
Jacob Vlijm

Respostas:

16

O problema é que você não pode "executar" um .desktoparquivo do Dash com argumentos, portanto, a configuração exatamente como você tem em mente é impossível. No entanto, supondo que seu script aceite argumentos, existem algumas opções alternativas elegantes, talvez até melhores:


  1. Salve seu script em ~/bin

    • remova a extensão
    • torná-lo executável
    • execute pressionando AltF2, digite o comando

      <scriptname> <argument> 

  1. Crie uma lista rápida no iniciador do Unity:

    (supondo que você salvou o script ~/bin, o tornou executável e removeu a extensão como em 1.)

    insira a descrição da imagem aqui

    [Desktop Entry]
    Name=name_of_your_script_like_you_see_it_in_Dash
    Exec=<scriptname> <default_argument>
    Icon=/path/to/some/icon
    Type=Application
    
    Actions=Panel;Panel -left;Panel -right;
    
    [Desktop Action Panel]
    Name=Panel
    Exec=<scriptname> <default_argument>
    OnlyShowIn=Unity;
    
    [Desktop Action Panel -left]
    Name=Panel -left
    Exec=<scriptname> <argument_1>
    OnlyShowIn=Unity;
    
    [Desktop Action Panel -left]
    Name=Panel -right
    Exec=<scriptname> <argument_2>
    OnlyShowIn=Unity;

    Salve-o como panel.desktopem ~/.local/share/applicationse arraste-o para o iniciador.


  1. Crie três atalhos de teclado diferentes, por exemplo Alt+ <, Alt+ ^, Alt+ >para executar seu script + argumentos:

    "Configurações do sistema"> "Teclado"> "Atalhos"> "Atalhos personalizados"

    Clique em "+" para adicionar seus comandos: <scriptname> <argument>


  1. Não é a mais óbvia, mas, explorando as opções, deve-se mencionar: você pode chamar uma lista de opções (zenity) no Dash:

    insira a descrição da imagem aqui

    Digite o primeiro caractere de sua opção, pressione return e seu script será executado com o argumento escolhido.

    insira a descrição da imagem aqui

    Novamente, assumindo que você salvou o script em ~ / bin, o tornou executável e removeu a extensão do idioma como em 1 .:

    • Copie o script abaixo em um arquivo vazio, salve-o como panel_options.sh, torne-o executável.

      #!/bin/bash
      
      test=$(zenity --list "1. Panel" "2. Panel -left" "3. Panel -right" --column="Panel options" --title="Panel")
      
      if [[ "$test" = "1. Panel"* ]]; then
          <scriptname> <default_argument>
      elif [[ "$test" = "2. Panel -left"* ]]; then
          <scriptname> <argument_1>
      elif [[ "$test" = "3. Panel -right"* ]]; then
          <scriptname> <argument_2>
      fi
    • Crie o arquivo .desktop a partir do código abaixo. Na Icon=linha, defina o caminho para o seu ícone, na Exec=linha o caminho para pane_options.sh, salve-o como panel.desktopem~/.local/share/applicatios

      [Desktop Entry]
      Name=Panel
      Exec=/path/to/panel_options.sh
      Icon=/path/to/some/icon
      Type=Application
      StartupWMClass=Zenity
Jacob Vlijm
fonte
Resposta muito completa. +1
Glutanimado
Muito completo; excelente resposta. Vale a recompensa! Obrigado!
Sir Robert
0

Na sua pergunta original, parece que a coisa certa a fazer seria mover o script para ~/bin/, que deve estar no seu $PATHpor padrão.
Se você fizer isso, poderá executar seu script usando AltF2novamente. Você também poderá passar argumentos para ele como em um shell.

Você também pode adicionar qualquer outra pasta onde mantenha seus scripts no seu $PATH. Para fazer isso, abra ~/.profileno editor de texto de sua escolha:

# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.

# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

No final, adicione uma linha (substituindo <folder>pela sua pasta) e salve o arquivo:

PATH="<folder>:$PATH"

Por exemplo, eu adiciono $HOME/.binao meu $PATHpara que meus binários não bagunçam minha pasta pessoal, mas você pode adicionar qualquer diretório ao seu caminho, mas não adicione nada perigoso (por exemplo, gravável no mundo).
As alterações entrarão em vigor no próximo login.

Donarsson
fonte