c语言中空格与nul,NUL字符在命令行中的重用

NUL是C语言中的“字符串”(C语言中并没有字符串这种数据类型)结束标志字符。ASCII为0, 在数字系统中,处理边界的那些值往往是特别的。

UNIX中真正不能作为文件名和目录名的字符只有两个:/和NUL, 前者是因为它必需担当路径的分隔符功能,后者则是因为众多用来处理文件名/目录/路径的C请库函数都以它为字串结束的约定. 尽管乍看起来不可思议, 其它的一个非可见字符, 控制字符都是可以作为文件名的一部分的, 比如换行符. 可以用

touch $'a\nb'

试试($''要求3.0的bash)

所以NUL可以用来在文件名中混入了怪字符时确保万无一失.

假设有下面的文件名:

a very long file name.txt

这样的文件名在很多情况下由于空格被约定为命令行参数的分隔符的缘故,会被当作是5个不同的文件进行处理,比如

for i in *.txt; do echo $i; done

echo "a very long file name.txt" | read i

也只会让你的i被赋值a而已.

grep pattern $(find -iname '*.txt')

find -iname '*.txt' | xargs cvs add

这样的处理也是一样.

所幸,已经有一批命令行工具提供了参数来以NUL来区隔不同的参数了:

grep -z -l pattern *.txt

会在向标准输出发送文件名时, 以NUL结尾每个文件名.

find -print0

做相同的事

而 xargs 也有--null, 是作为对输入中以NUL分隔参数的呼应.

cpio 要处理的文件名也是来自标准输入, 参数也是 --null

但, 如果文件名是已经被保存在一个文件文件中, 每行一个呢?

cat filename.txt

却没有一个选项以NUL代替换行符, tr!

cat filename.txt | tr "\n" "\0" | xargs cvs add

阅读(1255) | 评论(0) | 转发(0) |

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值