[20200214]xargs与别名.txt
--//上午在优化sql语句时,发现xargs与alias的程序存在一点点小问题,做一个记录。
$ alias rrlsql='rlwrap sqlplus '
$ rrlsql -s -l scott/book @ ver1 <<< ' '
PORT_STRING VERSION BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
$ echo @ver1 | xargs -I{} rrlsql scott/book {}
xargs: rrlsql: No such file or directory
--//也就是xargs不支持别名,应该是另外开一个shell,里面的环境与登录的bash shell环境不一致。
$ echo @ver1 | xargs -I{} sqlplus -s -l scott/book {}
PORT_STRING VERSION BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
$ alias ls
alias ls='ls --color=auto --time-style=+"%Y-%m-%d %H:%M:%S"'
$ echo bb1.txt | xargs ls -l
-rw-r--r-- 1 oracle oinstall 230 Feb 12 16:03 bb1.txt
$ ls -l bb1.txt
-rw-r--r-- 1 oracle oinstall 230 2020-02-12 16:03:45 bb1.txt
--//注意我显示的日期格式,执行时并没有现在别名ls。
https://stackoverflow.com/questions/34795432/using-xargs-to-pass-a-variable-to-alias-command
https://stackoverflow.com/questions/979453/how-can-i-use-aliased-commands-with-xargs
$ echo bb1.txt | xargs -IQ bash -c 'ls -l Q'
-rw-r--r-- 1 oracle oinstall 230 Feb 12 16:03 bb1.txt
--//不行。
$ echo bb1.txt | xargs -IQ bash -ic 'ls -l Q'
-rw-r--r-- 1 oracle oinstall 230 2020-02-12 16:03:45 bb1.txt
https://stackoverflow.com/questions/979453/how-can-i-use-aliased-commands-with-xargs
Aliases are shell-specific - in this case, most likely bash-specific. To execute an alias, you need to execute bash, but
aliases are only loaded for interactive shells (more precisely, .bashrc will only be read for an interactive shell).
bash -i runs an interactive shell (and sources .bashrc). bash -c cmd runs cmd.
--//我必须讲别名放入.bashrc文件中,重新登录打开新的终端:
--//加入如下.bashrc.
alias rrlsql='rlwrap sqlplus '
$ echo @ver1 | xargs -IQ bash -ci 'rrlsql -s -l scott/book Q'
PORT_STRING VERSION BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
--//OK!!
--//在测试中我还遇到一个问题。
$ echo 4xamnunv51w9j | xargs -IQ bash -ci rrlsql -s -l scott/book @dpc Q ''
SQL*Plus: Release 11.2.0.4.0 Production on Fri Feb 14 16:07:46 2020
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Enter user-name:
--//必须加双引号才OK。
$ echo 4xamnunv51w9j | xargs -IQ bash -ci "rrlsql -s -l scott/book @dpc Q ''"
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID 4xamnunv51w9j, child number 0
-------------------------------------
select * from dept where deptno=10
Plan hash value: 2852011669
----------------------------------------------------------------------------------------
| Id | Operation | Name | E-Rows |E-Bytes| Cost (%CPU)| E-Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 1 (100)| |
| 1 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 20 | 1 (0)| 00:00:01 |
|* 2 | INDEX UNIQUE SCAN | PK_DEPT | 1 | | 0 (0)| |
----------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL$1 / DEPT@SEL$1
2 - SEL$1 / DEPT@SEL$1
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("DEPTNO"=10)
Note
-----
- Warning: basic plan statistics not available. These are only collected when:
* hint 'gather_plan_statistics' is used for the statement or
* parameter 'statistics_level' is set to 'ALL', at session or system level
31 rows selected.
argment : typical all advanced partition predicate remote note parallel projection alias peeked_binds outline adaptive
--//另外的问题:
--//我的rlsql定义的是函数
$ echo 4xamnunv51w9j | xargs -IQ rlsql -s -l scott/book @dpc Q ''
Enter value for 2:
SP2-0546: User requested Interrupt or EOF detected.
argment : typical all advanced partition predicate remote note parallel projection alias peeked_binds outline adaptive
--//最后1个参数''无法解析,加入引号或者\转义可以通过。
$ echo 4xamnunv51w9j | xargs -IQ rlsql -s -l scott/book @dpc Q "''"
$ echo 4xamnunv51w9j | xargs -IQ rlsql -s -l scott/book @dpc Q \'\'
$ echo 4xamnunv51w9j | xargs -IQ rlsql -s -l scott/book @dpc Q all