“回声退出|”的目的是啥在“回声退出 | sqlplus 用户/pass@ora_instance @file.sql”?

Posted

技术标签:

【中文标题】“回声退出|”的目的是啥在“回声退出 | sqlplus 用户/pass@ora_instance @file.sql”?【英文标题】:What is the purpose of "echo exit |" in "echo exit | sqlplus user/pass@ora_instance @file.sql"?“回声退出|”的目的是什么在“回声退出 | sqlplus 用户/pass@ora_instance @file.sql”? 【发布时间】:2020-10-06 12:12:19 【问题描述】:

我从未见过有人通过管道将“退出”文字传递给命令执行。这是我试图理解的实际代码,

echo exit | sqlplus user/pass@ora_instance @file.sql

我可以理解后半部分没有任何问题,像这样执行sqlplus文件不需要发出退出命令,因为这不是交互式会话,因此无需终止。但即使他们想通过标准输入提供出口,那么< exit 可能是合适的,我可能没有直截了当地思考。帮我理解echo exit |的目的

我试过这样的东西来理解,

host:/home/user#>echo exit | grep e
exit
host:/home/user#>echo exit | cd $GROOVY_HOME
host:/home/user#>

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

【问题讨论】:

显然程序员认为sqlplus在标准输入中需要退出命令。sqlplus是否需要退出命令是另一回事;并非所有代码都是必要的或正确的。而“cat vs @user14387228 所以你相信 cat (在我的例子中是 echo )只是访问标准输入的一种方式?而已?那是反高潮 在您的第二个示例中,将命令传送到cd 永远不会起作用(尝试echo foo | cd $HOME)。 Here is why. sqlplus 几乎肯定会忽略它的标准输入,因为它有一个文件可以从中读取命令。 仅供参考,我发现another sqlplus question在执行sql脚本后使用相同的方法退出 【参考方案1】:

原来echo exit |在这个命令前面很重要。而且我们不能通过附加 < exit 来替换它,行为更改和 SQLPLUS 命令失败,找不到文件。

这个问题的答案是问题和接受的答案: Make SQL*Plus script quit

# the proper way to close sqlplus if .sql file is not terminated properly.
echo exit | sqlplus user/pass@ora_instance @file.sql 

shell脚本别无选择,也许我们可以编辑.sql文件

# Using < to access standard input stream throws file not found error
sqlplus user/pass@ora_instance @file.sql < exit # Won't work

感谢@Aserre 的输入(有关更多信息,请参阅问题中的 cmets)。 总结完毕。

【讨论】:

【参考方案2】:

cd $GROOVY_HOME 工作正常,但是您在子shell 中运行它,并且它没有读取其标准输入,因此将任何内容输入其中没有意义。一旦子 shell 退出,您将回到父 shell,其工作目录尚未被子 shell 更改。 (Children can't do that.)

试试这个来验证;

$ echo exit | sh -c 'cd /tmp; pwd; read -r; echo "$REPLY"'
/tmp
exit

$ pwd
/home/you

如果你取出read,shell 将简单地忽略它的标准输入。你可以利用它;

$ echo exit | ( sh -c 'cd /tmp; pwd'; nl )
/tmp
     1  exit

$ pwd
/home/you

请注意,shell 如何简单地忽略其标准输入,而 nl 取而代之的是拾取并处理它。

另外,为了解决另一个问题,&lt; exit 表示从名为exit 的文件重定向;如果您没有具有该名称的文件,那么您当然会得到“找不到文件”。 Bash shell 提供了一种替代方法,称为“此处字符串”;

sqlplus user/pass@ora_instance @file.sql <<<exit

或者您可以只使用一个普通的旧 here 文档,它可以一直移植到原始 Bourne shell:

sqlplus user/pass@ora_instance @file.sql <<____
exit
____

对于单行输入,带有管道的echo 可能更方便,但对于更长的sn-p 输入,能够将其嵌入到您的脚本中很方便。 (虽然还记得printf,它可以让你轻松地传递多行字符串;

printf '%s\n' 'First line' 'Second line' 'Third' | sqlplus ...

有关此的更多问题,例如在Multi-line string with extra space (preserved indentation)、Using variables inside a bash heredoc、How to cat <<EOF >> a file containing code? 等)

【讨论】:

感谢您的解释! :)

以上是关于“回声退出|”的目的是啥在“回声退出 | sqlplus 用户/pass@ora_instance @file.sql”?的主要内容,如果未能解决你的问题,请参考以下文章

是啥在 mongodb 中创建了默认的 ObjectID?

是啥在 mongodb 中创建了默认的 ObjectID?

如何确定是啥在重置我的连接?

如何指出是啥在线程转储文件中将线程置于 WAITING 状态

我可以用啥在 kivy 或 kivymd 中显示段落文本?

当 Java 中存在堆溢出时,我如何知道啥在使用内存?