我在这里面临同样的问题:从 cmd.exe (WSL) 向 bash 传递命令不起作用
但对我来说,那里的解决方案也不起作用。
我安装了 WSL,并且尝试通过 cmd.exe 运行名为“bet”的命令
- 打开cmd.exe
- 打字
bash -c -i "bet"
这会引发错误:
Command 'bet' not found, did you mean:
command 'bget' from deb ax25-tools (0.0.10-rc4-3build1)
command 'bst' from deb buildstream (1.4.1-1)
command 'beet' from deb beets (1.4.9-4)
command 'btt' from deb blktrace (1.2.0-5)
command 'bat' from deb bacula-console-qt (9.4.2-2ubuntu5)
command 'ben' from deb ben (0.9.0ubuntu2)
command 'fet' from deb fet (5.42.2-2build1)
command 'eet' from deb libeet-bin (1.23.3-8)
command 'net' from deb samba-common-bin (2:4.13.17~dfsg-0ubuntu1.20.04.1)
Try: sudo apt install <deb name>
当我尝试通过打开 cmd.exe 并输入 bash,然后在 linux 命令行中输入“bet”来执行此操作时,它工作正常。
我也尝试过这样做,wsl -e "bet"
但这也没有实现我想要做的事情。 (bet 命令接收我添加到末尾的附加参数,但该命令不会执行。如果我直接从 Linux shell 运行bet,该命令就会执行)。
仅供参考:Bet 是一款大脑提取工具,附带 FSL (https://fsl.fmrib.ox.ac.uk/fsl/fslwiki)
答案1
由于我对 Windows 及其一无所知cmd.exe
,因此这个答案假设是 Unix 环境。从大多数用户可见的角度来看,WSL 是一个 Unix 环境。
如果这是一个关于使用的问题cmd.exe
,那么该问题可能会在以下位置找到更合适的受众:超级用户网站。
问题似乎是可执行文件的路径bet
不在您正在启动的非交互式 shell 的搜索路径中。
有几种不同的解决方案:
使用可执行文件的确切路径名:
bash -c '/usr/local/fsl/bin/bet'
在调用之前更改脚本
PATH
内变量的值:bash -c
bet
bash -c 'PATH=$PATH:/usr/local/fsl/bin; bet'
PATH
启动命令时,将适当的目录路径附加到环境变量中bash -c
。这可以通过以下任一方式完成:PATH=$PATH:/usr/local/fsl/bin bash -c bet
env PATH="$PATH:/usr/local/fsl/bin" bash -c bet
PATH
通过修改当前 shell 的环境,将适当的目录路径附加到环境变量。这可以通过将以下内容添加到 shell 的启动文件(通常~/.bash_profile
用于bash
shell)来完成:PATH=$PATH:/usr/local/fsl/bin
这将在下一次登录 shell 会话时生效。然后使用
bash -c bet
在问题中,您还可以
-i
在启动bash -c
命令时包含该选项。这将使 shell 成为交互式 shell,并且它将解析该~/.bashrc
文件。因此,另一种选择是添加PATH=$PATH:/usr/local/fsl/bin
到该
~/.bashrc
文件,但请注意,该文件的目的是设置 shell 以进行交互式工作,其中可能包括运行您不想在每次启动时运行的命令bet
。作为替代方案,您可以将上述变量分配添加到一个全新的文件中,然后bash
从bash -i --rcfile envfile -c bet
...
envfile
新文件在哪里。如果您的文件具有上一点中提到的分配,您可以
bash
通过以下方式之一开始BASH_ENV=envfile bash -c bet
env BASH_ENV="envfile" bash -c bet
这样做可以避免必须
bash
作为交互式 shell 运行(除了~/.bashrc
默认情况下的解析之外,以交互模式运行 shell 对 shell 还有其他影响,例如启用作业控制)。