“回声退出|”的目的是啥在“回声退出 | 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
取而代之的是拾取并处理它。
另外,为了解决另一个问题,< 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”?的主要内容,如果未能解决你的问题,请参考以下文章