有什么办法可以shasum
到达仅有的打印哈希值?
我知道这可以通过将输出管道到另一个程序来实现,例如
shasum something | cut -d' ' -f1
有没有一种方法可以仅使用来实现此目的shasum
,而无需将结果通过管道传输到其他地方?
答案1
不可以。从 Perl shasum 6.02 和 GNU coreutils 9.1 中的相应程序开始,无法仅打印没有文件名(可以-
用于标准输入)的哈希的十六进制表示形式。
但不要让这成为一个问题! shell 旨在组合多个程序并管道是外壳的基本特征。您只需要小心不要接受错误 - 这是 sh 管道的设计缺陷。
在普通的 sh 中,通过命令替换使用“隐藏”管道实际上比 shell 管道更容易。
out=$(shasum <something) && echo "${out%%[!0-9A-Za-z]*}"
说明:命令的第一部分(在 之前&&
)设置out
为 的输出shasum
。由于是简单的赋值,所以它的状态是单个命令替换的状态,所以失败就失败shasum
。操作&&
员确保如果左侧失败,则整个命令都会失败。如果左侧成功,右侧将打印输出的前导字母数字字符。 (… && echo "${out%% *}"
也可以,如果将来的版本使用选项卡,上面的版本会稍微更强大。)
答案2
否,shasum
始终打印为其计算哈希值的文件的文件名,或者-
如果它从标准输入读取的话。
为了避免管道,你可以使用
perl -MDigest::SHA -e '$s=Digest::SHA->new(); $s->add(<>); print $s->hexdigest(),"\n"' filename
答案3
sha1sum
FWIW, (或)的 ast-opencksum -x sha1
也可以是ifsha1sum
的内置函数ksh93
,作为 ast-open 的一部分构建(通过builtin sha1sum
或 放在/opt/ast/bin
前面启用$PATH
),或者sha1
在 FreeBSD 上找到的实用程序,仅打印校验和求和标准输入时。
因此,通过这些实现,您可以执行以下操作:
sha1sum < thefile
sha1 < thefile
$ ./ast-open/arch/linux.i386-64/bin/ksh
$ builtin sha1sum
$ whence -a sha1sum
sha1sum is a shell builtin
sha1sum is a shell builtin version of /usr/bin/sha1sum
$ echo test | sha1sum
4e1243bd22c66e76c2ba9eddc1f91394e57f9f83
$ echo test | /usr/bin/sha1sum
4e1243bd22c66e76c2ba9eddc1f91394e57f9f83 -
openssl sha1
还可以打印原始校验和,您可以使用以下命令将其转换为十六hexdump -e '20/1 "%02x" "\n"'
进制xxd -p
:
openssl sha1 -binary -- "$file" | xxd -p
sha1sum
输出的 GNU 实现<thehexsum> -
(第二个空格可能替换为*
以指示二进制模式在类似 MSDOS 的系统上),shasum
对于perl
. openssl sha1
输出(stdin)= <thehexsum>
(旨在模拟 GNU coreutils 格式)openssl sha1 -r
输出-r
<thehexsum> *stdin
因此,正如已经说过的,对于这些,您必须从中提取校验和:
sha1sum < "$file" | awk '{print $1}'
(和set -o pipefail
事先支持保留sha1sum
(或文件输入重定向)失败(如果有)
或者,在类似 POSIX 的 shell 中:
sum=$(sha1sum < "$file") && sum=${sum%%[[:space:]]*}
[[:space:]]*
也可以替换为[![:xdigit:]]*
以删除以第一个非十六进制数字字符开头的所有内容。
答案4
您可以使用cut
命令
- 无需将管道插入切口
$ sha256sum ~/hwinfo.txt
d7e1653cc9e37552a70a9daebefdc3bc25949a691086cd325d071a98dfc105aa /home/user/hwinfo.txt
cut
2.使用空间作为分隔符时进行管道插入
$ sha256sum ~/hwinfo.txt | cut -d" " -f 1
d7e1653cc9e37552a70a9daebefdc3bc25949a691086cd325d071a98dfc105aa
有3个字段
字段 1 是 sha256sum
$ sha256sum ~/hwinfo.txt | cut -d" " -f 1
d7e1653cc9e37552a70a9daebefdc3bc25949a691086cd325d071a98dfc105aa
字段 2 为空,因为两个空格之间没有任何内容
$ sha256sum ~/hwinfo.txt | cut -d" " -f 2
字段 3 是文件名
$ sha256sum ~/hwinfo.txt | cut -d" " -f 3
/home/user/hwinfo.txt