Fish 命令替换不像 bash 或 zsh 那样工作
Fish command substitution doesn't work like in bash or zsh
当我尝试使用命令替换时,我偶然发现了鱼 shell(这是我最喜欢的 shell)的问题:
gcc (pkg-config --libs --cflags gtk+-2.0 cairo) -o drawing_widget drawing_widget.c
gcc: erreur: unrecognized command line option ‘-pthread -I/usr/include/gtk-2.0
-I/usr/lib/gtk-2.0/include -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I/usr/include/gdk-pixbuf-2.0
-I/usr/include/libpng16 -I/usr/include/pango-1.0 -I/usr/include/cairo -I/usr/include/glib-2.0
-I/usr/lib/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2
-I/usr/include/libpng16 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/harfbuzz
-I/usr/include/libdrm -I/usr/include/libpng16 -lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0
-lgdk_pixbuf-2.0 -lgio-2.0 -lpangoft2-1.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lfontconfig -lfreetype -lcairo ’
我已经用 bash 和 zsh 进行了测试,等效的评论有效:
gcc $(pkg-config --libs --cflags gtk+-2.0 cairo) -o drawing_widget drawing_widget.c
相关差异称为 "word splitting,",即变量扩展或命令替换的结果如何变成多个参数。
在bash和zsh中,分词发生在全白space。示例:
> for i in $(echo 1 2 3) ; do echo $i; done
1
2
3
在 fish 中,分词只发生在换行符上:
> for i in (echo 1 2 3); echo $i; end
1 2 3
在上面,循环只运行一次,$i 设置为'1 2 3'。 fish 行为的优点是带有 spaces 等的文件名不会像在 bash.
中那样引起问题
pkg-config
输出 space 分隔的文本:
> pkg-config --libs --cflags libcurl libssl
-lcurl -lssl -lcrypto -lz
所以它依赖于 bash 的分词行为。 (但如果任何标志需要嵌入白色,你就会遇到麻烦space。)
要在 fish 中获得相同的效果,您可以将 spaces 替换为换行符。 tr
是一个很好的工具:
pkg-config --libs --cflags libcurl libssl | tr -s ' ' \n
-s
标志有效地清除了 pig-config 输出的尾随 space。
当我尝试使用命令替换时,我偶然发现了鱼 shell(这是我最喜欢的 shell)的问题:
gcc (pkg-config --libs --cflags gtk+-2.0 cairo) -o drawing_widget drawing_widget.c
gcc: erreur: unrecognized command line option ‘-pthread -I/usr/include/gtk-2.0
-I/usr/lib/gtk-2.0/include -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I/usr/include/gdk-pixbuf-2.0
-I/usr/include/libpng16 -I/usr/include/pango-1.0 -I/usr/include/cairo -I/usr/include/glib-2.0
-I/usr/lib/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2
-I/usr/include/libpng16 -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/harfbuzz
-I/usr/include/libdrm -I/usr/include/libpng16 -lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0
-lgdk_pixbuf-2.0 -lgio-2.0 -lpangoft2-1.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lfontconfig -lfreetype -lcairo ’
我已经用 bash 和 zsh 进行了测试,等效的评论有效:
gcc $(pkg-config --libs --cflags gtk+-2.0 cairo) -o drawing_widget drawing_widget.c
相关差异称为 "word splitting,",即变量扩展或命令替换的结果如何变成多个参数。
在bash和zsh中,分词发生在全白space。示例:
> for i in $(echo 1 2 3) ; do echo $i; done
1
2
3
在 fish 中,分词只发生在换行符上:
> for i in (echo 1 2 3); echo $i; end
1 2 3
在上面,循环只运行一次,$i 设置为'1 2 3'。 fish 行为的优点是带有 spaces 等的文件名不会像在 bash.
中那样引起问题pkg-config
输出 space 分隔的文本:
> pkg-config --libs --cflags libcurl libssl
-lcurl -lssl -lcrypto -lz
所以它依赖于 bash 的分词行为。 (但如果任何标志需要嵌入白色,你就会遇到麻烦space。)
要在 fish 中获得相同的效果,您可以将 spaces 替换为换行符。 tr
是一个很好的工具:
pkg-config --libs --cflags libcurl libssl | tr -s ' ' \n
-s
标志有效地清除了 pig-config 输出的尾随 space。