标签: null

在 bash 中使用二进制数据作为参数 - 有什么方法可以允许空值?

所以我想将 binaryFile.dd 的前 512 个字节作为第二个参数传递给 myProgram 但 bash 去掉了所有的 NUL 字符。有什么办法可以在 bash 中避免这种情况,还是我什么都没有隐藏?

myProgram parameter1 "$(head -c 512 binaryFile.dd)"
Run Code Online (Sandbox Code Playgroud)

bash binary command-substitution null

7
推荐指数
1
解决办法
3251
查看次数

如何在不防止空字符串删除的情况下防止分词?

我需要将参数扩展作为程序参数传递。扩展导致文件名带有空格。因此,我用双引号将文件名作为一个单词:"$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”为空时的扩展。

bash parameter null

6
推荐指数
2
解决办法
1965
查看次数

如何在 sed 替换和删除命令中使用 NUL 字符作为分隔符?

这是我在打算替换/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)

sed null

6
推荐指数
2
解决办法
8115
查看次数

是否允许 shell 忽略脚本中的 NUL 字节?

因为这就是他们中的一些人正在做的事情。

> 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)

这是标准实际要求的一些兼容性问题吗?因为它看起来相当危险和出乎意料。

shell bash dash null

6
推荐指数
1
解决办法
1019
查看次数

`cat /dev/null > file` 的含义

在前同事创建的文档中,有以下命令:

cat /dev/null > /var/spool/mail/root   
Run Code Online (Sandbox Code Playgroud)

它旁边说它将清理邮箱。

有人可以解释一下这些命令是如何/为什么这样做的。在运行命令之前,我需要知道会发生什么。

我们正在尝试清理 var 上的空间,目前已达到 91%。

shell io-redirection files cat null

5
推荐指数
1
解决办法
2万
查看次数

我可以安全地忽略:“警告:命令替换:输入中忽略空字节”?

是否可以安全地忽略上述错误消息?或者是否可以删除空字节?我尝试删除它,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)

bash command-substitution null

5
推荐指数
0
解决办法
7383
查看次数

反转匹配行,NUL 分隔

我正在写一些处理文件匹配的东西,我需要一个反转操作。我有一个文件列表(例如 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 -print0sort -z和朋友已经(虽然有些BSD系统有它,所以如果能在“更轻便”来完成,我不会抱怨) .

我正在尝试在这里进行代码重用;另外,comm -23除了它不支持更改输入行分隔符(尚)之外,它基本上已经是一个完美的工具,而且comm无论如何都是一个被低估且不够知名的工具。如果 Unix/Linux 工具箱没有提供任何合理的东西,我可能会comm -23在 shell 中重新实现一种形式(简化为这个用例),因为脚本已经(出于其他原因)需要一个恰好支持的 shell …

grep find files comm null

4
推荐指数
1
解决办法
99
查看次数

使用 gnu find,-print0 和 -printf "%p\0" 有什么区别

在终端中,我可以运行...

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 …

find ruby null

4
推荐指数
1
解决办法
578
查看次数

从大文件的末尾删除空字节

我刚刚使用以下命令从运行 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)

dd files null

3
推荐指数
1
解决办法
3655
查看次数

带有空记录分隔符的 awk 仅打印一个文件

下面的代码如何只打印一个文件?

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)

awk null

3
推荐指数
1
解决办法
801
查看次数

标签 统计

null ×10

bash ×4

files ×3

command-substitution ×2

find ×2

shell ×2

awk ×1

binary ×1

cat ×1

comm ×1

dash ×1

dd ×1

grep ×1

io-redirection ×1

parameter ×1

ruby ×1

sed ×1