Estou tentando passar nomes de arquivos recuperados de tudo que é voidtools por meio da linha de comando es.exe (funciona de forma semelhante ao mlocate) para um "visualizador de imagens" como gwenview ou nsxiv (no ambiente wsl ).
Isso funciona:
IFS=$'\n'; nsxiv $(es keyword1 keyword2)
Mas isso não funciona:
IFS=$'\n'; nsxiv $(es $(wl-paste))
quando keyword1 keyword2
está atualmente armazenado na área de transferência do sistema.
user@wsl:~$ wl-paste | od -c
0000000 k e y w o r d 1 k e y w o r d
0000020 2 \n
0000022
Por que? Eu pensei que a substituição do comando $() pudesse ser aninhada. Em vez disso, nsxiv retornaNo such file or directory
es é um alias que converte a saída es.exe para corresponder ao ambiente wsl)
es() {
# Invoke the es.exe with provided arguments and pipe its output
# through sed to replace Windows-style line endings with Unix-style line endings,
# then use xargs to handle newline-delimited input and pass each path as a single argument to wslpath.
# -p argument - search paths
# -sort date-modified - sensible default
# 2>/dev/null - remove "xargs: wslpath: terminated by signal 13"
/mnt/c/Users/user/Downloads/ES-1.1.0.27.x64/es.exe -p -sort date-modified -instance 1.5a "$@" | sed 's/\r$//' | xargs -n1 -d'\n' wslpath 2>/dev/null
}
Portanto, se
wl-paste
printskeyword1 keyword2
e você tiverIFS
definido apenas a nova linha, o shell não dividirá as duas palavras-chave ees $(wl-paste)
será como executares "keyword1 keyword2"
na linha de comando do shell.Agora, supondo que você queira conter
IFS
apenas a nova linha para a saída dees
, você tem algumas opções.Possivelmente o mais simples seria algo como executar
nsxiv $(es $(wl-paste | tr ' ' '\n'))
para transformar o espaço em uma nova linha que seria então dividida.Ou você pode fazer isso em partes e alternar
IFS
entre:Observe que, em qualquer caso, as expansões sem aspas também passarão por globbing, portanto, valores como
*
ou qualquer outra coisa que se pareça com um glob que corresponda a um nome de arquivo existente podem causar problemas. Adicioneset -f
ao início para desativar isso.