简单 cat 和重定向到变量之间的区别

Ugn*_*nes -4 permissions shell-script cat kali-linux

我写了以下脚本

#!/bin/bash
echo "Power Details"
fall='/sys/class/power_supply/BAT1'
full=cat $fall/energy_full
echo 'printing here'
echo $full
Run Code Online (Sandbox Code Playgroud)

它显示以下错误:

./power.sh: line 4: /sys/class/power_supply/BAT1/energy_full: Permission denied
Run Code Online (Sandbox Code Playgroud)

我正在访问的文件对所有人都具有读取权限。另外,虽然我只是打印文件的输出,例如(编辑代码的第 4 行):

cat $path/energy_full
Run Code Online (Sandbox Code Playgroud)

它没有显示错误。为什么会这样?如何为cat filenameV / Svar1 = cat filename有什么不同?在不更改要访问的文件的读写执行权限的情况下,我应该如何解决该问题?
注意:我以 root 用户身份运行 Kali Linux

Dre*_*rew 8

问题是您使用错误的语法将命令的输出分配给变量。

要回答你的问题问的,之间的区别cat filename,并var=cat filename是,在第一种情况下,你正在执行的命令catfilename。在第二个,您正在执行的命令filename而设定的值varcat。但是,filename不是可执行命令,因此您会收到权限错误。

由于您实际上想将cat命令的输出分配给一个变量,您需要这样做:

var=$(cat filename)
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句,命令 `var1 = cat filename`(在讨论中给出)会做一些仍然不同的事情——它会尝试将 `var` 作为命令运行,参数为“=”、“cat”和“文件名” . 在shell中*空间很重要*所以`x=y`和`x = y`做完全不同的事情。此外,扩展@roaima 的评论,您还应该在`echo` 结果时使用双引号(`echo "$full"`,而不是`echo $full`)。 (3认同)