Problema na execução de aliases dentro do programa. (Resolvido)

Iniciado por dmaia, 30 de Abril de 2014, 21:01

tópico anterior - próximo tópico

dmaia

Olá a todos. Como instruído no tópico para iniciantes do fórum, postei minha dúvida aqui.

Utilizo o ubuntu 14.04 LTS e shell tcsh. Preciso rodar um programa e existe uma série de aliases que são iniciados junto com o terminal.

O problema é que executando o comando direto no terminal funciona perfeitamente:

|xxxxxxx|~/Modelos/Spitzer/HD209975/fabrice_light_X/obs/lines>rmlinks
find: atenção: você especificou a opção -maxdepth depois de uma não opção de argumento -type, mas as opções não são posicionáveis (-maxdepth afetam testes espeficicados antes disto tão bem quanto aqueles especificados depois disso). Por favor especifique as opções antes de outros argumentos.

removido "AlIII_COL_DATA"
removido "AlIII_F_OSCDAT"
removido "AlIII_F_TO_S"

Aqui rmlinks é o alias, e funcionou como esperado... Porém quando executo um programa que chama o rmlinks ocorre um erro:
rmlinks: Command not found.

Segue a linha que executa o alias no programa:

#
# Clean up the directory structure, removing all
#uneccessary files.
#
mv -f OBSFRAME     obs_cont
mv -f TIMING       cont_timing
mv -f EWDATA       ewdata_fin
mv -f HYDRO        hydro_cont
#

rmlinks

rm -f EDDFACTOR
rm -f ES_J_CONV
rm -f EDDFACTOR_INFO

Isso, claro, é apenas parte do script.

Aqui é como o alias está definido:
alias rmlinks "find * -type l -maxdepth 0 -exec rm -vf {} ';' "

Essas coisas podem ser definidas tanto no .tcshrc, quanto em um startup do programa. Eu já tentei em ambos mas o problema persiste. Eu gostaria de anexar alguns arquivos para ajudar (.tcshrc, o script do programa, etc) mas não encontro o botão de anexo quando clico em "opções adicionais...", apenas notificar resposta e etc... Por isso coloquei pequenas partes no corpo do texto.

O estranho é que isso funcionava e parou um belo dia... Erro na forma que o programa está escrito com certeza não é, pois isso é um programa de solução de transporte radiativo de atmosfera estelar utilizado há algum tempo em vários lugares, imagino que deve ser algo no meu shell, má instalação do tcsh, .tcshrc corrompido, alguma atualização que mudou algo...

Alguma sugestão?



irtigor

Os aliases são lidos somente no modo interativo, se quiser usar o que está no tcshrc em um script, primeiro você tem que dar um "source ~/.tcshrc" ou equivalente.

dmaia

Olá,

Eu testei escrever o alias no .tcshrc e usar o que você disse no começo do script e deu certo... Então o problema é por aí mesmo. Mas eu ainda preciso optimizar isso.

Existe um executável (aliases_for_cmfgen.sh) que eu carrego no .tcshrc e quando o programa inicia preciso que ele leia os aliases lá.

No .tcshrc está:

source ~/cur_cmf/com/aliases_for_cmfgen.sh

E no "aliases_for_cmfgen.sh", em uma parte está escrito:

alias dscratch  'rm -vf *SCRATCH*'
#
# Removes soft links from current directory
#
alias rmlinks   "find * -type l -maxdepth 0 -exec rm -vf {} ';'"
#

Na linha de raciocínio que você me passou colocar "source ~/cur_cmf/com/aliases_for_cmfgen.sh" no começo do script também deu certo.

O problema é que existem muitos programas, é inviável alterar um por um dos scripts. Fora que não quero mexer neles pois nem foi eu quem escreveu.

Eu preciso que isso seja carregado automaticamente (os aliases em "aliases_for_cmfgen.sh"), quando abro o terminal por exemplo. Eu imaginava que a linha em .tcshrc "source ~/cur_cmf/com/aliases_for_cmfgen.sh" faria isso por mim, quando eu abrisse um terminal.

Existe uma forma dessa optimização ser feita?

Obrigado.

irtigor

Seu texto está confuso... de qualquer forma, como você está executando o script?

Obs: pra código, use a tag code.

dmaia

Ok, vou tentar ser mais direto. É que não entendo o que é "ser lido somente em modo interativo".

Em uma parte do seu texto você disse: "primeiro você tem que dar um "source ~/.tcshrc" ou equivalente".

O que eu fiz foi escrever isso na primeira linha do código, não era isso?

Se era isso, eu deveria escrever isso na primeira linha de todos os outros códigos certo? Se sim, por isso fica inviável, pois teria que editar dezenas de scripts.

O que eu tentei perguntar no post acima foi se teria outra forma de fazer isso mais rápido, ao invés de escrever na primeira linha de cada código.

Eu executo o código que desejo com ./nome.sh

PS: Não entendi a parte da tag, não sei o que é isso.

irtigor

Chamar explicitamente é a melhor forma, e é uma mudança simples que pode ser feita em lote. De qualquer forma, qual é o shebag? Usuário, grupo e permissões do arquivo tcshrc batem com quem executa?

dmaia

Obrigado, problema resolvido. Era realmente o shebang.

Eu não sabia o que era isso, descobri quando fui procurar para responder sua pergunta.

No script estava: #!/bin/csh. Dei um echo $SHELL e obtive: /bin/tcsh. Então mudei o shebang para: #!/bin/tcsh e agora tudo funciona. Muito obrigado!