[20260602]sqlplus使用host注意.txt
--//发现一个小问题,host执行操作系统命令重定向时覆盖生成文件。
SCOTT@book01p> help host
HOST
----
Executes an operating system command without leaving SQL*Plus.
Enter HOST without command to display an operating system prompt.
You can then enter multiple operating system commands.
HO[ST] [command]
--//一般生产系统环境,设置set -o noclobber,这样可以不小心重定向时覆盖已经存在的文件。
$ touch /tmp/linesize.sql
$ echo set linesize $(stty size | cut -d" " -f2) > /tmp/linesize.sql
-bash: /tmp/linesize.sql: cannot overwrite existing file
--//这样可以一定程度避免生产系统环境的误操作导致的文件覆盖,临时要解决这个问题使用>| 代替 >.
$ echo set linesize $(stty size | cut -d" " -f2) >| /tmp/linesize.sql
--//而sqlplus下执行host不受这个限制。
SCOTT@book01p> host ls -l /tmp/linesize.sql
-rw-r--r--. 1 oracle oinstall 17 Jun 2 17:33 /tmp/linesize.sql
SCOTT@book01p> host echo set linesize $(stty size | cut -d" " -f2) > /tmp/linesize.sql
--//如果跟踪相应进程,注意不是oracle进程,而是执行sqlplus的进程,可以发现执行是:
SCOTT@book01p> @ spid
==============================
SID : 223
SERIAL# : 3729
PROCESS : 7446
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SERVER : DEDICATED
SPID : 7448
PID : 42
P_SERIAL# : 24
KILL_COMMAND : alter system kill session '223,3729' immediate;
PL/SQL procedure successfully completed.
$ strace -f -p 7446
....
[pid 7695] execve("/bin/bash", ["/bin/bash", "-c", "echo set linesize $(stty size | "...], [/* 63 vars */]) = 0
[pid 7695] brk(0) = 0x23d5000
--//相当于打开一个新的bash shell,执行命令如下:
$ bash -c "echo set linesize $(stty size | cut -d" " -f2) > /tmp/linesize.sql"
--//不会报错。
--//改写如下就会报错。
$ bash -c "set -o noclobber;echo set linesize $(stty size | cut -d" " -f2) > /tmp/linesize.sql"
bash: /tmp/linesize.sql: cannot overwrite existing file
--//记录下来,仅仅提醒自己host的执行方式。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-3173112/ ,如需转载,请注明出处,否则将追究法律责任。