为什么使用Python调用Bash脚本时返回256



我有一个简单的bash脚本

check_repo() {
if cat /etc/apt/sources.list | grep "deb https://http.kali.org/kali kali-rolling main contrib non-free" || cat /etc/apt/sources.list | grep "deb https://http.kali.org/kali kali-rolling main non-free contrib"
then
return 0
else
return 1
fi
}
check_repo

此脚本检查sources.list文件是否存在特定的repo,如果存在,则返回0&如果不是,则它返回1,但当我通过CCD_ 1使用python3调用脚本时;"检查";它打印256个

为什么给出这样的输出&我该怎么修?

  • 操作系统:Kali Linux
  • 内核:x86_64 Linux 5.9.0-kali4-amd64
  • 外壳:bash 5.1.0

感谢您提前回答

这是os.system()返回的内容;在类Unix系统上,高8位是结果代码,低8位是信号(如果没有信号,则为0(。

在Python中这样做的正确方法是

check = False
with open("/etc/apt/sources.list") as repo:
for line in repo:
if "deb https://http.kali.org/kali kali-rolling main contrib non-free" 
in line or "deb https://http.kali.org/kali kali-rolling main non-free contrib" 
in line:
check = True
break

在shell脚本中执行此操作的正确方法是

if grep -q -e "deb https://http.kali.org/kali kali-rolling main contrib non-free" -e "deb https://http.kali.org/kali kali-rolling main non-free contrib" /etc/apt/sources.list
then ...

(或者重构以使用grep -E和单个正则表达式来覆盖这两个表达式;请参阅下面的尝试(。

如果你想把它放在一个函数中,grep的退出状态将是0或1,所以不需要单独使用return

从Python脚本调用它的正确方法是

import subprocess
check = subprocess.check_call(['grep', '-q', '-E',
r'deb https://http.kali.org/kali kali-rolling main( contrib| non-free){2}',
'/etc/apt/sources.list'])

在Unix上,waitstatus_to_exitcode((可用于将结果(退出状态(转换为退出代码。在Windows上,结果直接是退出代码。此处:https://docs.python.org/3/library/os.html#os.system

最新更新