"echo exit |" 在 "echo exit | sqlplus user/pass@ora_instance @file.sql" 中的目的是什么?
What is the purpose of "echo exit |" in "echo exit | sqlplus user/pass@ora_instance @file.sql"?
我从未见过有人通过管道 'exit' 文字来命令执行。这是我试图理解的实际代码,
echo exit | sqlplus user/pass@ora_instance @file.sql
我可以毫无问题地理解后半部分,像这样执行sqlplus文件不需要发出exit命令,因为这不是交互式会话,不需要终止。但即使他们想通过标准输入退出,那么 < 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
被执行,但我不明白为什么!
原来echo exit |
前面这样的命令很重要。我们不能通过附加 < exit
行为更改来替换它,并且 SQLPLUS 命令失败,没有找到文件。
这个问题的答案是问题和接受的答案:
# 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 的投入(有关更多信息,请参阅问题下的评论)。
总结为关闭。
cd $GROOVY_HOME
工作正常,但你是 运行 它在一个子 shell 中,并且它没有读取它的标准输入,所以将任何东西输入它是没有意义的。一旦 subshell 退出,您将回到 parent shell,其工作目录未被 child 更改。 (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
或者你可以只使用一个普通的旧文档,它可以一直移植到原始的 Bourne shell:
sqlplus user/pass@ora_instance @file.sql <<____
exit
____
对于单行输入,使用管道 echo
可能更方便,但对于较长的输入片段,能够将其嵌入到脚本中会更方便。 (不过还记得 printf
可以让你轻松传入 multi-line 字符串;
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? 等)
我从未见过有人通过管道 'exit' 文字来命令执行。这是我试图理解的实际代码,
echo exit | sqlplus user/pass@ora_instance @file.sql
我可以毫无问题地理解后半部分,像这样执行sqlplus文件不需要发出exit命令,因为这不是交互式会话,不需要终止。但即使他们想通过标准输入退出,那么 < 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
被执行,但我不明白为什么!
原来echo exit |
前面这样的命令很重要。我们不能通过附加 < exit
行为更改来替换它,并且 SQLPLUS 命令失败,没有找到文件。
这个问题的答案是问题和接受的答案:
# 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 的投入(有关更多信息,请参阅问题下的评论)。 总结为关闭。
cd $GROOVY_HOME
工作正常,但你是 运行 它在一个子 shell 中,并且它没有读取它的标准输入,所以将任何东西输入它是没有意义的。一旦 subshell 退出,您将回到 parent shell,其工作目录未被 child 更改。 (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
或者你可以只使用一个普通的旧文档,它可以一直移植到原始的 Bourne shell:
sqlplus user/pass@ora_instance @file.sql <<____
exit
____
对于单行输入,使用管道 echo
可能更方便,但对于较长的输入片段,能够将其嵌入到脚本中会更方便。 (不过还记得 printf
可以让你轻松传入 multi-line 字符串;
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? 等)