我的机器上有一个二进制文件,最后变成了一种非常奇怪的状态,我不知道它到底出了什么问题。我已经用尽了我所知道的所有诊断方法(包括一些我从谷歌搜索中找到的新方法),所以我想我会在这里征求建议,希望能学到一些东西!
有问题的二进制文件是flutter
(尽管我认为这不是特别相关)。它位于我的机器上/home/alyssa/.local/bin/flutter/bin/flutter
。我的$PATH
包含~/.local/bin/flutter/bin
- 这是通过注入的.bashrc
。
症状
- 从终端,我可以
flutter --version
无错误地运行。 which flutter
没有返回任何输出并且退出代码 1。type flutter
如预期般返回flutter is /home/alyssa/.local/bin/flutter/bin/flutter
。whereis flutter
返回flutter: /home/alyssa/.local/bin/flutter
- 但是,某些子进程无法运行 Flutter 命令,并出现权限错误。最简单的复制方法是通过 python3 的子进程:
$ python3 -c "import subprocess; subprocess.run(['flutter', '--version'])"
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/usr/lib/python3.6/subprocess.py", line 423, in run
with Popen(*popenargs, **kwargs) as process:
File "/usr/lib/python3.6/subprocess.py", line 729, in __init__
restore_signals, start_new_session)
File "/usr/lib/python3.6/subprocess.py", line 1364, in _execute_child
raise child_exception_type(errno_num, err_msg, err_filename)
PermissionError: [Errno 13] Permission denied: 'flutter'
我看过的东西
- 我已经
python3
为其他几个二进制文件运行了该配方并且它按预期工作(打印版本时没有错误)。 - 我通过相同的方法运行了和
env
,并与我的原始终端进行比较,输出都相同。因此,我相信启动的子进程是以相同的用户身份使用相同的 运行的,因此应该不会有问题。whoami
whereis
python3
$PATH
- 为了以防万一,我做了一个
find . -name 'flutter' -type f
- 这没有发现我的文件系统上有任何其他二进制文件。 namei -olm ~/.local/bin/flutter/bin/flutter
表明所有相关文件/文件夹的权限均正常:
$ namei -olm ~/.local/bin/flutter/bin/flutter
f: /home/alyssa/.local/bin/flutter/bin/flutter
drwxr-xr-x root root /
drwxr-xr-x root root home
drwxr-xr-x alyssa alyssa alyssa
drwxr-xr-x alyssa alyssa .local
drwxr-xr-x alyssa alyssa bin
drwxr-xr-x alyssa alyssa flutter
drwxr-xr-x alyssa alyssa bin
-rwxr-xr-x alyssa alyssa flutter
- 我确实认为有一点不同,那就是子进程没有使用 运行
/bin/bash
。我相信这一点是因为我无法type flutter
使用该配方运行 - 它找不到,type
因为那是 bash 内置的。但这并没有给我根本原因 - 一定是文件或我的什么地方出了问题,$PATH
或者真正的问题是什么。
版本
- 操作系统:Ubuntu 18.04.6 LTS
- Bash:GNU bash,版本 4.4.20(1)-release(x86_64-pc-linux-gnu)
- Python:3.6.9
如果您对其他诊断/我可以尝试的方法有任何建议,我将不胜感激!