Comando personalizado no terminal com uma variável

1

Redhat Linux Enterprise

Editando um perfil de terminal - Execute um comando personalizado em vez do meu shell Comando personalizado:

tail -3000f /home/user1/folder/$PROJECT/folder2/folder3/text.log

Quando eu salvo e relanço, recebo:

tail: cannot open '/home/user1/folder/$PROJECT/folder2/folder3/text.log' for reading

Quando copio esse caminho diretamente para outro terminal, o processamento funciona bem. O comando personalizado auto está escapando da variável $ PROJECT?

    
por Dirk 04.10.2011 / 20:18

3 respostas

2

Eu assumo que você está usando o gnome-terminal, e que o "comando customizado" que você menciona é o comando customizado que o gnome-terminal irá executar ao invés do shell padrão (geralmente bash).

O terminal Gnome é um emulador de terminal. Não tem conhecimento do conceito de variáveis ou expansão variável. É por isso que, se solicitado a executar uma string contendo $PROJECT , fará exatamente isso, não expandirá $PROJECT . Expansão variável é o trabalho do shell.

Leia os artigos da Wikipédia sobre terminal e shell para entender melhor a diferença entre um terminal e um shell.

Se eu estiver correto com a suposição de que você está executando o gnome-terminal com um comando personalizado, use este comando personalizado:

bash -c "tail -3000f /home/user1/folder/$PROJECT/folder2/folder3/text.log"

Isto irá dizer ao gnome-terminal para executar o bash com alguns argumentos. Os argumentos dirão bash para executar o comando tail com alguns argumentos. Só que desta vez, antes de executar tail , o bash expandirá a variável $PROJECT antes de executar.

Observe que iniciar o bash usando o parâmetro -c fará com que o bash não leia os arquivos de inicialização ( .bashrc e / ou .profile ). Se $PROJECT for definido em um desses arquivos, o comando acima poderá falhar porque $PROJECT será expandido para nada.

Você pode forçar o bash a ler os arquivos de inicialização usando o parâmetro -l :

bash -l -c "tail -3000f /home/user1/folder/$PROJECT/folder2/folder3/text.log"

Note que o bash tem esse conceito de "shell de login" e "shell interativo" com algumas implicações em quais arquivos de inicialização são lidos. Para mais explicações sobre a diferença, leia a seguinte pergunta e respostas: Diferença entre. bashrc e .bash_profile .

    
por 05.10.2011 / 13:39
0

Você está colocando esse comando em um arquivo e fornecendo o arquivo ou tornando-o executável e executando-o como um script? É possível que o ambiente não esteja sendo passado para o script. É $ PROJECT uma variável de ambiente (exportado ou setenv'ed) ou é uma variável no seu shell atual?

Se você estiver usando bash ou sh, você pode tentar export $PROJECT ou se você estiver usando csh / tcsh você pode tentar setenv PROJECT=(the value of $PROJECT)

    
por 04.10.2011 / 21:17
0

Apenas um palpite - tente:

tail -3000f /home/user1/folder/${PROJECT}/folder2/folder3/text.log

Ele usa variável escrita como $ {PROJECT} em vez de $ PROJECT. Infelizmente não estou conseguindo testá-lo.

    
por 04.10.2011 / 22:46