Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在bash中使用$SHELL环境变量前面的空格的奇怪行为_Linux_Bash_Shell - Fatal编程技术网

Linux 在bash中使用$SHELL环境变量前面的空格的奇怪行为

Linux 在bash中使用$SHELL环境变量前面的空格的奇怪行为,linux,bash,shell,Linux,Bash,Shell,当我使用以下命令时,一切正常(新的gnome终端打开,当前工作目录更改,终端保持打开): gnome终端-e“bash-c'cd/”;$SHELL # ↑ #此处没有空格字符 但当我使用: gnome终端-e“bash-c'cd/”;$SHELL # ↑ #注意空格 我可以看到一个打开的终端,但是我看不到当前工作目录是否被更改,因为终端会立即关闭 我的问题是:为什么会发生

当我使用以下命令时,一切正常(新的gnome终端打开,当前工作目录更改,终端保持打开):

gnome终端-e“bash-c'cd/”;$SHELL
#                                ↑
#此处没有空格字符
但当我使用:

gnome终端-e“bash-c'cd/”;$SHELL
#                                 ↑
#注意空格
我可以看到一个打开的终端,但是我看不到当前工作目录是否被更改,因为终端会立即关闭


我的问题是:为什么会发生这种情况;如果我在第二种情况下放置空格,怎么会出错呢?

在第一种情况下,gnome终端执行

bash -c "cd /;/bin/bash"
在第二种情况下,它运行

bash -c "cd /;" /bin/bash
第一种情况表示“evaluate
cd/;/bin/bash
”,它将使用cd并运行一个交互式shell


第二种情况表示“评估
cd/;
,将
$0
设置为
/bin/bash
”,它将运行cd,然后退出

<代码> GNOME终端< /代码>对它给出的命令进行自己的解析,使用它显然不考虑<代码>;

作为单词分隔符,因此如果a
与非空白字符相邻,它被视为该非空白字符单词的一部分

如果传递给
gnome-terminal
的命令中包含shell元字符,这可能会导致意外行为

我在
gnome终端
过程中使用
strace
,查看它的功能。第一命令

gnome-terminal -e "bash -c 'cd /';$SHELL"
导致gnome终端运行以下命令

execve("/bin/bash", ["bash", "-c", "cd /;/bin/bash"])
execve("/bin/bash", ["bash", "-c", "cd /;", "/bin/bash"])
第二个命令

gnome-terminal -e "bash -c 'cd /'; $SHELL"
导致gnome终端运行以下命令

execve("/bin/bash", ["bash", "-c", "cd /;/bin/bash"])
execve("/bin/bash", ["bash", "-c", "cd /;", "/bin/bash"])
也就是说,您还应该注意,像
bash-c'cd/'
这样的命令不会对在它之后运行的任何命令的工作目录产生持久的影响。因此,我认为您键入的第一个命令得到了预期的结果,这仅仅是因为gnome终端解析功能不正确,而编写它的更健壮的方法是

gnome-terminal -e "bash -c 'cd /;$SHELL'"

这样做的目的是什么?另外,因为空格使它成为另一个命令(也就是说,它不是“bash-c”的参数)。@ElliottFrisch我只想了解为什么第一个命令按我的意愿工作,而第二个命令按我的意愿工作。