我正在尝试通过 es.exe 命令行(其工作方式与 mlocate 类似)将从所有 voidtools检索到的文件名传递给“图像预览器”,例如 gwenview 或 nsxiv(在wsl环境中)。
这有效:
IFS=$'\n'; nsxiv $(es keyword1 keyword2)
但这不起作用:
IFS=$'\n'; nsxiv $(es $(wl-paste))
当前keyword1 keyword2
存储在系统剪贴板中。
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
为什么?我以为 $() 命令替换可以嵌套。但 nsxiv 返回No such file or directory
es 是将 es.exe 输出转换为匹配 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
}
因此,如果
wl-paste
打印keyword1 keyword2
,并且您已将其IFS
设置为仅换行符,则 shell 将不会拆分两个关键字,并且es $(wl-paste)
就像es "keyword1 keyword2"
在 shell 命令行中运行一样。现在,假设您希望的
IFS
输出仅包含换行符es
,那么您有一些选择。可能最简单的方法就是将
nsxiv $(es $(wl-paste | tr ' ' '\n'))
空格改为换行符,然后进行拆分。或者,你可以分部分进行并
IFS
在其间进行更改:请注意,在任何情况下,未加引号的扩展也会经过通配符,因此像 这样的值
*
或任何其他看起来像通配符的值,如果恰好与现有文件名匹配,都可能导致问题。添加set -f
到开头以禁用此功能。