所以我想将 binaryFile.dd 的前 512 个字节作为第二个参数传递给 myProgram 但 bash 去掉了所有的 NUL 字符。有什么办法可以在 bash 中避免这种情况,还是我什么都没有隐藏?
myProgram parameter1 "$(head -c 512 binaryFile.dd)"
Run Code Online (Sandbox Code Playgroud) 我需要将参数扩展作为程序参数传递。扩展导致文件名带有空格。因此,我用双引号将文件名作为一个单词:"$var".
只要$var包含文件名,程序就会得到一个单字参数并且它工作正常。但是,有时扩展会导致空字符串,当作为参数传递时,会破坏程序(我无法更改)。
根据 Bash 参考手册,不删除空字符串是指定的行为:
如果没有值的参数在双引号内展开,则结果为空参数并保留。
但是,我如何管理需要引用变量但也需要丢弃空字符串扩展的情况?
编辑:
感谢 George Vasiliou,我发现我的问题中缺少一个细节(只是尽量保持简短:))。运行程序是一个很长的java调用,缩写如下:
java -cp /etc/etc MyClass param1 param2 "$var" param4
Run Code Online (Sandbox Code Playgroud)
事实上,使用if乔治所描述的语句就可以解决问题。但是它需要一个在then子句中带有“$var”的调用,另一个在子句中没有“$var” else。
为了避免重复,我想看看是否有一种方法可以使用单个调用来丢弃“$var”为空时的扩展。
这是我在打算替换/path/to/a为/path/to/busingNUL作为分隔符/定界符时尝试的方法:
$ cat pathsList| sed -r -e 's\0/path/to/a\0/path/to/b\0g'
sed: -e expression #1, char 27: number option to `s' command may not be zero
Run Code Online (Sandbox Code Playgroud)
我想要使用NUL: NUL和/是唯一不允许的字符ext4fs,并且/已经被大量用作路径名分隔符。另外,我想避免仅仅为了能够使用而引用和取消引用我的数据sed。
如果NUL不能用作分隔符(比方说),我可以接受任何比引用和取消引用我的数据更好的解决方法。
$ sed --version
sed (GNU sed) 4.4
Run Code Online (Sandbox Code Playgroud) 因为这就是他们中的一些人正在做的事情。
> echo echo Hallo, Baby! | iconv -f utf-8 -t utf-16le > /tmp/hallo
> chmod 755 /tmp/hallo
> dash /tmp/hallo
Hallo, Baby!
> bash /tmp/hallo
/tmp/hallo: /tmp/hallo: cannot execute binary file
> (echo '#'; echo echo Hallo, Baby! | iconv -f utf-8 -t utf-16le) > /tmp/hallo
> bash /tmp/hallo
Hallo, Baby!
> mksh /tmp/hallo
Hallo, Baby!
> cat -v /tmp/hallo
#
e^@c^@h^@o^@ ^@H^@a^@l^@l^@o^@,^@ ^@B^@a^@b^@y^@!^@
^@
Run Code Online (Sandbox Code Playgroud)
这是标准实际要求的一些兼容性问题吗?因为它看起来相当危险和出乎意料。
在前同事创建的文档中,有以下命令:
cat /dev/null > /var/spool/mail/root
Run Code Online (Sandbox Code Playgroud)
它旁边说它将清理邮箱。
有人可以解释一下这些命令是如何/为什么这样做的。在运行命令之前,我需要知道会发生什么。
我们正在尝试清理 var 上的空间,目前已达到 91%。
是否可以安全地忽略上述错误消息?或者是否可以删除空字节?我尝试删除它,tr但我仍然收到相同的错误消息。
这是我的脚本:
#!/bin/bash
monitordir="/home/user/Monitor/"
tempdir="/home/user/tmp/"
logfile="/home/user/notifyme"
inotifywait -m -r -e create ${monitordir} |
while read newfile; do
echo "$(date +'%m-%d-%Y %r') ${newfile}" >> ${logfile};
basefile=$(echo ${newfile} | cut -d" " -f1,3 --output-delimiter="" | tr -d '\n');
cp -u ${basefile} ${tempdir};
done
Run Code Online (Sandbox Code Playgroud)
当我运行inotify-create.sh并在其中创建一个新文件时"monitordir"
我得到:
[@bash]$ ./inotify-create.sh
Setting up watches. Beware: since -r was given, this may take a while!
Watches established.
./inotify-create.sh: line 9: warning: command substitution: ignored null byte in input
Run Code Online (Sandbox Code Playgroud) 我正在写一些处理文件匹配的东西,我需要一个反转操作。我有一个文件列表(例如 from find . -type f -print0 | sort -z >lst)和一个匹配列表(例如 from grep -z foo lst >matches– 请注意,这只是一个示例;matches可以是任何任意子集(包括空的或完整的)或lst),现在我想反转这个列表.
背景:我正在实现类似于find(1) 之类的东西,除了文件列表(尽管文件在调用时确实存在于文件系统中,但该列表可能已被预先过滤)。如果文件列表可能没有那么大,我可以使用find "${files[@]}" -maxdepth 0 -somecondition -print0,但即使适度使用我正在编写的内容也会超出 Linux 或 BSDargv大小限制。
如果这些行不是 NUL 分隔的,我可以使用comm -23 lst matches >inverted. 如果匹配不是 NUL 分隔的,我可以使用grep -Fvxzf matches lst. 但是,从我在第一段中提到的生成器来看,两者都是。
假设GNU工具安装,所以这种需求无法移植超越例如Debian的,因为我使用find -print0,sort -z和朋友已经(虽然有些BSD系统有它,所以如果能在“更轻便”来完成,我不会抱怨) .
我正在尝试在这里进行代码重用;另外,comm -23除了它不支持更改输入行分隔符(尚)之外,它基本上已经是一个完美的工具,而且comm无论如何都是一个被低估且不够知名的工具。如果 Unix/Linux 工具箱没有提供任何合理的东西,我可能会comm -23在 shell 中重新实现一种形式(简化为这个用例),因为脚本已经(出于其他原因)需要一个恰好支持的 shell …
在终端中,我可以运行...
find . -type f -print0
./testdir/testfile2.txt./testdir/testfile.txt
Run Code Online (Sandbox Code Playgroud)
进而...
find . -type f -printf "%p\0"
./testdir/testfile2.txt./testdir/testfile.txt
Run Code Online (Sandbox Code Playgroud)
它们在视觉上看起来相同,但由于这是关于空字符,所以并没有说明太多。如果我通过 ruby repl 运行:
2.5.1 :001 > `find . -type f -print0`
=> "./testdir/testfile2.txt\u0000./testdir/testfile.txt\u0000"
Run Code Online (Sandbox Code Playgroud)
进而
2.5.1 :002 > `find . -type f -printf "%p\0"`
Traceback (most recent call last):
3: from /usr/share/rvm/rubies/ruby-2.5.1/bin/irb:11:in `<main>'
2: from (irb):2
1: from (irb):2:in ``'
ArgumentError (string contains null byte)
Run Code Online (Sandbox Code Playgroud)
-print0选项输出的内容与 有什么区别printf?
测试系统信息:
姓名: Linux XPS-15-9570 4.15.0-30-generic #32-Ubuntu SMP Thu Jul 26 17:42:43 UTC 2018 x86_64 x86_64 …
我刚刚使用以下命令从运行 Linux 发行版的 PC 上的 Raspberry Pi 备份了 microSD 卡:
dd if=/dev/sdx of=file.bin bs=16M
Run Code Online (Sandbox Code Playgroud)
microSD 卡只有 3/4 满,所以我想在这个巨大文件的末尾有一些空字节。我很确定我不需要那个。如何有效地从末尾删除这些空字节,以便以后可以使用此命令恢复它?
cat file.bin /dev/zero | dd of=/dev/sdx bs=16M
Run Code Online (Sandbox Code Playgroud) 下面的代码如何只打印一个文件?
find "$fdir" -type f -name "${fnam}-*.png" -print0 | awk -v RS='\0' -F'[-.]' '{print $(NF-1), $0}' | cat -vet
Run Code Online (Sandbox Code Playgroud)
这给了我
04 /home/flora/edvart/docs/schimmel-04.png$
Run Code Online (Sandbox Code Playgroud)
但做find "$fdir" -type f -name "${fnam}-*.png"给
/home/flora/edvart/docs/schimmel-04.png
/home/flora/edvart/docs/schimmel-05.png
/home/flora/edvart/docs/schimmel-06.png
/home/flora/edvart/docs/schimmel-07.png
/home/flora/edvart/docs/schimmel-08.png
/home/flora/edvart/docs/schimmel-09.png
/home/flora/edvart/docs/schimmel-10.png
/home/flora/edvart/docs/schimmel-11.png
/home/flora/edvart/docs/schimmel-12.png
/home/flora/edvart/docs/schimmel-13.png
/home/flora/edvart/docs/schimmel-1.png
/home/flora/edvart/docs/schimmel-2.png
/home/flora/edvart/docs/schimmel-3.png
Run Code Online (Sandbox Code Playgroud)