Sim. a substituição de comandos remove todas as novas linhas 1 .
Para contornar:
var=$(xsel --clipboard; echo .)
var=${var%?}
Isso é adicionar .\n
a essa saída. E remova o ponto depois com ${var%?}
(o \n
é cuidado pela substituição do comando).
Observe que, exceto com zsh
, as variáveis de shell não podem conter bytes NUL.
Se você deseja preservar o status de saída:
var=$(xsel --clipboard; ret=$?; echo .; exit "$ret")
ret=$?
var=${var%?}
Lembre-se de citar $var
ao expandi-lo:
printf %s "$var"
Uma função auxiliar:
cmdsubst() {
_var=$1; shift
eval "$_var="'$("$@"; ret=$?; echo .; exit "$ret")
_ret=$?
'"$_var=\${$_var%?}"
return "$_ret"
}
Para ser usado como:
cmdsubst var xsel --clipboard
Para preservar o "negrito" ... Algumas ferramentas exportam a seleção CLIPBOARD como text / html além de apenas uma string UTF8. Nesse caso (com versões recentes de xclip
), você pode fazer:
cmdsubst html xclip -sel c -o -t text/html
Veja a saída de xclip -sel c -o -t TARGETS
para ver quais destinos de seleção o proprietário atual da seleção CLIPBOARD fornece.
Exemplo após copiar uma parte do meu comentário para Mikel acima no iceweasel:
$ xclip -sel c -o -t TARGETS
TIMESTAMP
TARGETS
MULTIPLE
SAVE_TARGETS
text/html
text/_moz_htmlcontext
text/_moz_htmlinfo
UTF8_STRING
COMPOUND_TEXT
TEXT
STRING
text/x-moz-url-priv
$ xclip -sel c -o -t text/html
<span class="comment-copy"><i>should</i> remove <i>only one</i> trailing newline</span>
$ xclip -sel c -o -t TEXT
should remove only one trailing newline
1 Uma exceção a isso são os shells da família rc
onde você pode dizer que não quer nenhum pós-processamento com a sintaxe var = ''(){xsel --clipboard}
.