Para poder usar uma variável com $ em seu valor como usuário atual, bem como algum outro usuário através do comando su

2

Suponha que o valor de uma variável tenha $ símbolo (armazenando o caminho de uma classe interna java).

Eu quero processá-lo como usuário atual, bem como algum outro usuário (suponha que o usuário atual seja root para que eu não precise digitar a senha ao usar o comando su ).

Exemplo:

path_value=/home/username/filename\.class

echo ${path_value}

su username -c "echo ${path_value}"

O resultado do primeiro echo :

/home/username/filename$1.class

Os resultados do segundo comando echo dentro de su :

/home/username/filename.class

Eu quero usar a variável de forma que eu possa processá-la nos dois locais com o mesmo valor.

    
por sureshcskkumar 27.06.2018 / 06:32

4 respostas

3

Exporte o valor pelo ambiente e, em seguida, faça com que o shell interno o expanda. Assumindo que o shell de login do username é do tipo Bourne:

$ export path_value=/home/username/filename\.class
$ su username -c 'echo "$path_value"'
/home/username/filename$1.class

Isso funcionará mesmo que a variável contenha aspas, mas não funcionará se o comando usado limpar o ambiente. Eu não acho que su deva fazer isso, mas sudo pode.

Se sabemos que a variável não pode conter aspas simples², então seria apenas uma citação simples da string expandida no shell interno:

$ path_value=/home/username/filename\.class
$ su username -c "echo '$path_value'"
/home/username/filename$1.class

(Observe que as aspas estão na ordem oposta).

¹ se o shell de login do username for csh ou tcsh , substitua echo "$path_value" por echo $path_value:q ; se for rc ou derivativo, com echo $path_value .

² e caracteres de nova linha se o shell de login do usuário for csh ou tcsh e não contiver bytes que não formam caracteres válidos se o shell de login do usuário for yash . Tenha também em atenção que os argumentos iniciados por - ou contendo barras invertidas seriam um problema com echo , é melhor usar printf '%s\n' para dados arbitrários

    
por 27.06.2018 / 09:20
1

Por que não usar sudo em vez de su ?

# path_value=/home/username/filename\.class
# echo "${path_value}"
/home/username/filename$1.class
# sudo -u username echo "${path_value}"
/home/username/filename$1.class
    
por 27.06.2018 / 07:03
0

no segundo echo, coloque sua variável entre aspas simples - como:

su username -c "echo '${path_value}'"

Dessa forma, echo interpreta o conteúdo da variável como uma string e o sinal "$" - é escapado.

    
por 27.06.2018 / 06:59
0

Lembre-se de citar corretamente todas as expansões. O shell não irá espreitar dentro de strings entre aspas simples.

path_value='/home/username/filename$1.class'
printf '%s\n' "$path_value"

Saídas /home/username/filename$1.class .

su username -c "printf '%s\n' '$path_value'"

Saída idêntica.

No segundo comando, o shell atual expandirá o valor de path_value dentro do comando tho, como é duplicado. O printf interno irá imprimir a única string entre aspas.

Relacionados:

Observe que ${variable} é exatamente igual a $variable . Adicionar {...} não o cita de nenhuma maneira e é necessário apenas se o caractere imediatamente após a expansão fosse usado como parte de seu nome, como em "${variable}x" .

    
por 27.06.2018 / 09:01