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
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法