Variável não armazenada durante a execução de comandos bash via gnome-terminal

0

Eu tenho um plugin que gera e copia para a área de transferência um comando pronto para colar que cria um arquivo que eu quero mover e renomear via entrada do usuário.

Se eu usar isso para obter o arquivo modificado mais recente no diretório, o arquivo será copiado e renomeado corretamente conforme especificado no script:

#!/bin/bash
gnome-terminal --tab-with-profile=PROFILENAME --working-directory="/PATH/WAY" -x bash -c "$(xclip -se c -o); find /PATH/WAY -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r | head -n1 | grep -o "/home.*" | xargs -I '{}' cp '{}' /PATH/TO/Desktop/test.txt; read -p 'Press Enter to close.'"

No entanto, se eu tentar adicionar a entrada do usuário dessa forma, a variável não parece estar definida:

gnome-terminal --tab-with-profile=PROFILENAME --working-directory="/PATH/WAY" -x bash -c "$(xclip -se c -o); echo File name?; read newfile; echo File will be named $newfile.txt; find /PATH/WAY -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r | head -n1 | grep -o "/PATH.*" | xargs -I '{}' cp '{}' /PATH/TO/Desktop/$newfile.flv; read -p 'Press Enter to close.'"

Porque a saída diz File will be named .txt enquanto aguardo File will be named USERINPUT.txt e o arquivo não é copiado.

Curiosamente, se eu usar esses comandos em um script bash como esse, tudo funcionará bem:

#!/bin/bash
echo File name?
read newfile
echo File will be named $newfile.txt
find /PATH/WAY -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r | head -n1 | grep -o "/PATH.*" | xargs -I '{}' cp '{}' /PATH/TO/Desktop/$newfile.txt
read -p 'Press Enter to close.'

Eu não entendo o que estou fazendo errado ...

    
por MonkeyBack 07.11.2017 / 21:50

1 resposta

2

O único parâmetro grande após bash -c está entre aspas duplas. Isso significa que a substituição de certas coisas (incluindo $newfile ) é realizada aqui pelo shell mais externo, ou seja, o shell que está prestes a iniciar o gnome-terminal, antes de iniciá-lo. Nesse contexto, essa variável é indefinida.

Eu recomendo que você escolha um script separado, como mostrado na parte inferior da postagem. Os one-liners são terrivelmente ilegíveis de qualquer maneira.

Outras possibilidades incluem a troca das citações ' e " na linha de comando, de modo que ' seja o externo (isto é, $newline permanece $newline e não é substituído pelo shell mais externo, é interpretado posteriormente pelo iniciado por gnome-terminal); ou escapando do sinal $ em $newfile as \$newfile .

E enquanto estamos nisso:

$(xsel ...) executa o conteúdo da área de transferência como um comando (ou uma série de comandos) sem qualquer validação. Por exemplo. se sua área de transferência contiver a string rm -rf ~ , seu diretório inicial é whoops ido. Não sei qual é a sua intenção, mas, para sua segurança, você deve abandonar essa abordagem e encontrar outra solução!

echo File name? realiza a correspondência de padrões de shell em arquivos cujos nomes consistem em cinco caracteres: name e, em seguida, um caractere arbitrário. Use um par de aspas simples ou duplas.

Você se refere ao nome da variável $newfile sem aspas. Isso resultará em comportamento defeituoso se contiver espaços em branco. Consulte-o como "$newfile" .

    
por egmont 07.11.2017 / 22:25