为什么在从C#创建的进程中运行bash命令时,我的$PATH不同?

为什么在从C#创建的进程中运行bash命令时,我的$PATH不同?,c#,linux,bash,.net-core,C#,Linux,Bash,.net Core,我在CentOS上有一个.NET 5程序,它使用.service文件从systemd服务启动。它需要通过命令行执行另一个程序,因此我编写了以下代码: var processStartInfo = new ProcessStartInfo() { FileName = "/bin/bash", Arguments = "-c \"echo $PATH\"", WorkingDirectory = Path.GetD

我在CentOS上有一个.NET 5程序,它使用.service文件从systemd服务启动。它需要通过命令行执行另一个程序,因此我编写了以下代码:

var processStartInfo = new ProcessStartInfo()
{
    FileName = "/bin/bash",
    Arguments = "-c \"echo $PATH\"",
    WorkingDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
};

var process = Process.Start(processStartInfo);
process.WaitForExit();
从CentOS终端执行时,
echo$PATH
返回
/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/home/test\u user/.local/bin:/home/test\u user/bin
。 但是使用上面的代码运行
echo$PATH
会给我
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/sbin

为什么2$PATH值不同?
搜索$PATH时,我得到了一些关于
/etc/profile
~/.bash\u profile
/etc/bash.bashrc
~/.bashrc
的结果,但是我不确定如何解释这些文件。

问题是,上面的代码在使用系统控制台时调用的是非交互式shell,而不是交互式shell

shell可以交互或非交互方式使用。互动的 模式下,它们接受从键盘键入的输入。执行时 shell以非交互方式执行从文件读取的命令

如第6.2节所述,交互式和非交互式shell在启动时有不同的方法检查
$PATH
值。作为交互式shell Bash,可以从
etc/profile
~/.Bash\u profile
~/.Bash\u login
、和
~/.profile
中读取
$PATH
值,但作为非交互式shell Bash只接受环境变量
Bash\u ENV
中的任何值作为
$PATH
值:

以非交互方式调用

当Bash以非交互方式启动时 例如,运行一个shell脚本,它在中查找变量BASH_ENV 环境,如果它出现在那里,则扩展其值,并使用 扩展值作为要读取和执行的文件的名称


从C#内部启动bash进程的方式来看,它是一种非交互、非登录调用。在终端中,它是一个交互式外壳。您没有说明如何配置终端,所以我不知道它是登录调用还是非登录调用。所有这些都会影响执行哪些启动文件。但是,
PATH
应该在环境中。如果您从终端启动了C#程序,它应该继承路径,因此错误可能在别处。你没有说你是如何运行你的程序的。@user1934428在CentOS上从应用程序启动器我选择Konsole来启动终端。C#程序通过systemd服务启动,使用.service文件,ExecStart=/usr/bin/dotnet/var/www/my program/MyProgram.dll,User=root。我不确定这些是否会被视为“登录调用”,至少它解释了为什么不调用PATH。至少它是一个非交互式调用,并且您的
.bashrc
未被处理。请参阅bash手册页的
调用
部分,了解bash进程启动时会发生什么。@user1934428我不完全清楚交互式shell的描述。所以我使用Konsole是在调用一个交互式shell,但是从C#启动就像我的代码调用一个非交互式shell一样?我还试图查看$BASH_ENV的值,但是
echo$BASH_ENV
给了我一个空行。很可能是的。为什么它应该是互动的?您可以(如手册页中所述)打印变量
$-
。如果它包含字母
i
,则您处于一个交互式shell中
BASH_ENV
始终为空,除非您将其显式设置为somwhere,但我不明白您为什么要这样做。我不明白你想从印刷中得到什么。。。。