加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

鱼命令替换不像bash或zsh那样工作

发布时间:2020-12-15 21:18:16 所属栏目:安全 来源:网络整理
导读:当我尝试使用命令替换时,我偶然发现了鱼壳(这是我最喜欢的 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
当我尝试使用命令替换时,我偶然发现了鱼壳(这是我最喜欢的 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

解决方法

相关的差异称为“单词拆分”,即变量扩展或命令替换的结果如何转换为多个参数.

在bash和zsh中,单词拆分发生在所有空格上.例:

> for i in $(echo 1 2 3) ; do echo $i; done
1
2
3

在鱼中,单词拆分仅在换行符上发生:

> for i in (echo 1 2 3); echo $i; end
1 2 3

在上面,循环只运行一次,$i设置为’1 2 3′.鱼行为的优点是带有空格等的文件名不会像在bash中那样引起问题.

pkg-config输出以空格分隔的文本:

> pkg-config --libs --cflags libcurl libssl
-lcurl -lssl -lcrypto -lz

所以它依赖于bash的单词分裂行为. (但如果任何标志需要嵌入空格,你就会遇到麻烦.)

要在fish中获得相同的效果,可以使用换行符替换空格. tr是一个很好的工具:

pkg-config --libs --cflags libcurl libssl | tr -s ' ' n

-s标志有效地清除了pig-config输出的尾随空格.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读