Bash “的目的是什么?”;回声出口;在;echo退出| sqlplus用户/pass@ora_instance@file.sql";?

Bash “的目的是什么?”;回声出口;在;echo退出| sqlplus用户/pass@ora_instance@file.sql";?,bash,shell,sqlplus,Bash,Shell,Sqlplus,我从未见过有人用“退出”字来执行命令。这就是我想要理解的代码 echo exit | sqlplus user/pass@ora_instance @file.sql host:/home/user#>echo exit | grep e exit host:/home/user#>echo exit | cd $GROOVY_HOME host:/home/user#> 我可以理解下半部分,没有任何问题,像这样执行sqlplus文件不需要发出exit命令,因为这不是交互式

我从未见过有人用“退出”字来执行命令。这就是我想要理解的代码

echo exit | sqlplus user/pass@ora_instance @file.sql
host:/home/user#>echo exit | grep e
exit
host:/home/user#>echo exit | cd $GROOVY_HOME
host:/home/user#>
我可以理解下半部分,没有任何问题,像这样执行sqlplus文件不需要发出exit命令,因为这不是交互式会话,不需要终止。但即使他们想通过stdin向exit提供信息,那么
可能是合适的,我可能没有正确的想法。帮助我理解回声退出的目的|

我试过这样的事情来理解

echo exit | sqlplus user/pass@ora_instance @file.sql
host:/home/user#>echo exit | grep e
exit
host:/home/user#>echo exit | cd $GROOVY_HOME
host:/home/user#>

这有助于我理解这里的exit被视为文字,而不是命令exit
echo exit |
似乎阻止执行
cd$GROOVY_HOME
,但我不明白为什么

事实证明,在这样的命令前面退出回声是非常重要的。我们不能通过添加
来替代它,因为行为发生了变化,SQLPLUS命令失败,找不到任何文件

此问题的答案为问题和公认答案:

shell脚本没有其他选择,也许我们可以编辑.sql文件

# Using < to access standard input stream throws file not found error
sqlplus user/pass@ora_instance @file.sql < exit # Won't work
#使用<访问标准输入流抛出未找到文件错误
sqlplus用户/pass@ora_instance@file.sql
感谢@Aserre提供的信息(更多信息请参见问题下的评论)。
总结结束。

cd$GROOVY\u HOME
工作正常,但您在子shell中运行它,并且它没有读取其标准输入,因此将任何内容导入其中都没有意义。一旦子shell退出,您就回到父shell中,其工作目录没有被子shell更改。()

试试这个来验证

$echo exit|sh-c'cd/tmp;pwd;read-r;回显“$REPLY”
/tmp
出口
$pwd
/家/你
如果取出
读取
,shell将忽略其标准输入。你可以利用这一点

$echo exit |(sh-c'cd/tmp;pwd';nl)
/tmp
1出口
$pwd
/家/你
请注意,shell是如何简单地忽略其标准输入的,而
nl
将其拾取并处理

另外,为了解决另一个问题,
表示从名为
exit
的文件重定向;如果您没有具有该名称的文件,当然会得到“未找到文件”。bashshell提供了一种称为“herestring”的替代方法


sqlplus用户/pass@ora_instance@file.sql显然,程序员认为sqlplus需要在标准中使用exit命令。sqlplus是否需要退出命令是另一回事;并非所有代码都是必需的或正确的。还有“猫对@user14387228”,你认为猫(在我的例子中是echo)只是一种访问stdin的方式?没别的了?这是您的第二个示例中的反高潮,将命令传送到
cd
永远不起作用(请尝试
echo foo | cd$HOME
sqlplus
几乎肯定会忽略它的标准输入,因为它有一个文件可以从.FYI读取命令,我发现它在执行sql脚本后使用了相同的方法退出(感谢您的解释!)