专栏首页乐享123Xargs Sh -c Skipping the First Argument

Xargs Sh -c Skipping the First Argument

其实这个问题已经见过很多次了,但是知其然不知其所以然;今天偶尔在stackoverflow上看到了,记录一下;

shell中的arg1, arg2…

在bash shell中,1, 2代表arg1, arg2,比如

1 2 3

# echo hello world|xargs echo $1 $2 hello world

0 代表执行环境,如果是一个执行脚本的话,0 代表其脚本名;比如下面这个脚本hello.sh:

1 2 3 4 5

#!/bin/bash echo $0 echo $1 echo $2

执行:

1

# ./hello.sh arg1 arg2

会输出

1 2 3

./hello.sh arg1 arg2

xargs 调用sh -c 中的arg

但是使用xargs sh -c时会出现一个比较疑惑的情况,比如执行:

1 2 3

# echo hello world|xargs sh -c 'echo $1 $2' world

此时1代表world,2已经没有值了;而执行

1 2 3

# echo hello world|xargs sh -c 'echo $0 $1' hello world

反而得到了正确结果;

why

之前我一直认为xargs sh -c调用的时候吃掉了$0,不求甚解;偶尔读了一下sh的手册才发现玄机:

From the documentation for the -c option:

Read commands from the command_string operand. Set the value of special parameter 0 (see Special Parameters) from the value of the command_name operand and the positional parameters (1, 2, and so on) in sequence from the remaining argument operands.

就是说在上面这条命令中,其实是没有找到要执行的命令,或者说要执行的命令为空,而hello world作为1, 2传给一个空命令了;

后面追加一个dummy的命令会看的更清楚:

1 2 3

# echo hello world|xargs sh -c 'echo $1 $2' _ hello world

后面我加了一条下划线作为xargs的dummy command,这样1, 2就恢复正常了;

总结

虽然这是一个啥用也没有的Magic Topic,但是搞明白之后还是挺有意思的,娱乐用;

另外隐隐约约觉得这里面隐含着一些安全方面的问题,暂时只是一种感觉,将来需要留意有没有这方面的hack手段;

引用

https://stackoverflow.com/questions/41043163/xargs-sh-c-skipping-the-first-argument

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 批量删除mongo Collections

    happy123.me
  • Python捕获所有异常

    老生常谈了,但是在Pyflake检查出E722错误时有时候又犯老毛病。人年纪大了越来越有老年痴呆倾向 -_- …..

    happy123.me
  • What Do Cryptic Github Comments Mean?

    happy123.me
  • shell脚本的调试方法

    今天的内容比较简单,今天上班的时候,发现了一个问题,就是在一个很长的脚本里面,由于系统版本不同,导致有些字符处理函数处理的过程失效了,没有得到想要的结果...

    AsiaYe
  • 腾讯云镜像仓库实验记录

    首先到github个人首页,浏览器地址栏红框位置为用户名(github可以通过用户名或者邮箱方式登录)

    3143308275
  • 远程桌面启动Houdini

    最近疫情比较严重大家都是在家办公的, 需要远程登录公司里的开发机. 但是远程桌面无法直接启动Houdini, 会报OpenGL的错

    逍遥剑客
  • IaaS并非开发人员的终极目标

    如果你正围绕供应用开发人员使用的基础设施即服务(IaaS),制定贵企业的数据中心战略,那么你构建的数据中心是错误的。应用开发人员通过门户网站或API直接控制底层...

    静一
  • .NET领域驱动设计—初尝(原则、工具、过程、框架)

    原则对于任何一项技术实现来说都是至关重要的,在设计某一个系统功能的时候我们讲究的是设计原则:

    王清培
  • [Introduction]万字手撕Go http源码server.go

    从路由注册到监听本地端口后请求路由的一系列动作的分析,基本上仅限于net/http server.go这个包文件的路由相关部分解读

    Wzy_CC
  • 【我问 Crossin】Crossin 这个名字是什么意思?

    1 新建 git 项目是用 git init 还是 git clone,git init 和 git clone 都是创建新仓库,两个有什么区别? git in...

    Crossin先生

扫码关注云+社区

领取腾讯云代金券