Toggle / coisa macro / xargs para variáveis do shell

1

Então, estou preso fazendo muitas compilações cruzadas e estou digitando coisas assim muito

FOO=bar command --some-args
BAZ=qxt other-command --other-args

Mas, obviamente, as variáveis reais do shell são longas e difíceis de digitar. O Bash não é uma linguagem dinâmica, então os backticks não funcionarão (ele tenta executar o comando FOO = bar). O xargs está errado, embora algo parecido que funcione antes da avaliação do comando seja bom. Definir as variáveis de shell que eu quero como variáveis de env atinge o mesmo problema que os backticks, se eu colocá-los antes do comando; Mudar envs explicitamente toda vez me deixa com o mesmo problema de digitação de variáveis de shell, com a diversão adicional de poluir meu ambiente posterior. Existe algo como pushenv e popenv?

Existe alguma maneira que eu possa armazenar e recuperar através de um identificador curto todas as variáveis do shell que eu possa precisar, para que eu possa fazer algo como

shellvars1 command --some-args
shellvars2 other-command --other-args

As diferentes combinações de variáveis de shell são grandes, mas finitas, então, se há uma maneira de descarregar isso para um script de ajuda, posso digitá-las todas uma vez, não consigo descobrir uma maneira de fazer isso.

Pontos de bônus: o bash tem algo parecido com a habilidade do tcsh de fazer

!24:s/FOO/BAZ/

?

Isso também pode ajudar (embora não tanto). Eu principalmente quero remover oportunidades para a minha habilidade sobrenatural em erros de digitação para mostrar-se.

    
por Bandrami 17.05.2014 / 07:41

2 respostas

2

Você parece estar um pouco confuso sobre o que é uma variável de shell e o que não é. Todas as variáveis no seu post são variáveis de ambiente, não variáveis de shell. Para definir uma variável de shell:

foo=bar

Para definir uma variável de ambiente:

export FOO=BAR

(ou setenv em c shells). Mas em

FOO=BAR command

a atribuição contraintuitivamente tem um significado diferente de antes e define uma variável de ambiente apenas no ambiente do comando. Dito isto, este simples script deve responder às suas necessidades:

#!/bin/bash
VAR1=VAL1 ... VALN=VARN "$@"

Quanto à questão bônus: Eu não acho que o bash possa fazer isso, mas o zsh é incrível e pode fazer isso. Ambos

^FOO^BAR

e

!!:s/FOO/BAR/

tem o mesmo efeito e, para o seu exemplo específico:

!24:s/FOO/BAR/
    
por 17.05.2014 / 09:20
1

Você pode colocar atribuições de variáveis em um alias.

alias shellvars1='FOO=bar '
alias shellvars2='BAZ=qxt '

O espaço no final das variáveis diz ao shell para considerar as palavras subsequentes para expansão de alias também. Por exemplo, se a for um alias para somecommand --option , então shellvars1 shellvars2 a wibble será executado em FOO=bar BAZ=qxt somecommand --option a .

Você também pode usar funções. Use aliases se as atribuições forem corrigidas e funcione se você quiser mais flexibilidade (por exemplo, atribuições condicionais).

shellvars1 () {
  local tmp=2
  FOO=$((tmp + tmp)) "$@"
}
…
shellvars1 mycommand

Você também pode tornar variáveis locais para uma função. Se uma variável é local para uma função, então uma diretiva export também é restrita ao escopo da função.

shellvars1 () {
  local FOO=bar
  export FOO
  "$@"
}
    
por 19.05.2014 / 04:49

Tags