如何确定我正在使用的当前shell?
ps
仅仅命令的输出是否足够?
如何在不同版本的UNIX中完成?
我正在尝试编写一个shell脚本,在运行时,将设置一些将在调用者的shell中保留的环境变量.
setenv FOO foo
Run Code Online (Sandbox Code Playgroud)
在csh/tcsh中,或
export FOO=foo
Run Code Online (Sandbox Code Playgroud)
在sh/bash中只在脚本执行期间设置它.
我已经知道了
source myscript
Run Code Online (Sandbox Code Playgroud)
将运行脚本的命令而不是启动新的shell,这可能导致设置"调用者"环境.
但这里有一个问题:
我希望这个脚本可以从bash或csh调用.换句话说,我希望任何一个shell的用户都能够运行我的脚本并改变他们的shell环境.所以'source'对我来说不起作用,因为运行csh的用户无法获取bash脚本,而运行bash的用户无法获取csh脚本.
有没有合理的解决方案不需要在脚本上编写和维护两个版本?
这是关于如何在shell脚本中使用ssh的后续问题?题.如果我想在该机器的后台运行的远程机器上执行命令,我该如何获取ssh命令?当我尝试在命令末尾包含&符号时,它就会挂起.命令的确切形式如下所示:
ssh user@target "cd /some/directory; program-to-execute &"
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?需要注意的一点是,登录目标计算机始终会生成文本标题,并且我已设置SSH密钥,因此无需密码.
您可以在shell脚本运行时编辑它并让更改影响正在运行的脚本吗?
我很好奇csh脚本的具体情况,我有批处理运行一堆不同的构建风格并运行一整夜.如果我在操作过程中发生了某些事情,我想进入并添加其他命令,或者注释掉未执行的命令.
如果不可能,是否有任何shell或批处理机制可以让我这样做?
当然我已经尝试过了,但是在我看到它是否有效之前还需要几个小时,而且我很好奇幕后发生了什么或者没有发生什么.
当我运行以下命令时csh
,我什么都没有,但是它可以工作bash
,是否有任何等效的csh
可以将标准错误重定向到标准输出?
somecommand 2>&1
Run Code Online (Sandbox Code Playgroud) 我从Linux C Shell调用SQL*Plus:
sqlplus username/password @file.sql var1 var2 var3
如果我传递一个字符串var1
,这个字符串可以多长时间?
它是由操作系统管理的吗?在这种情况下:
Linux version 2.6.9-100.ELsmp (mockbuild@x86-010.build.bos.redhat.com) (gcc version 3.4.6 20060404 (Red Hat 3.4.6-11)) #1 SMP Tue Feb 1 12:17:32 EST 2011
更新:经验测试产生以下结果:
我想我会sqlldr
用来克服这一点.
在bash中,我可以为一个命令设置一个临时环境变量,如下所示:
LD_LIBRARY_PATH=/foo/bar myprogram
Run Code Online (Sandbox Code Playgroud)
我可以在csh/tcsh中做类似的事情吗?我可以
setenv LD_LIBRARY_PATH /foo/bar; myprogram; unsetenv LD_LIBRARY_PATH
Run Code Online (Sandbox Code Playgroud)
,但这将失去变量之前的任何值.
我想在特定的挂起更改列表中获取文件差异.我希望我能做到这一点:
p4 diff -c 999
Run Code Online (Sandbox Code Playgroud)
有人可以帮助我串联一些csh魔法来实现这一目标吗?
也许把它的输出p4 opened -c 999
和管道输送到p4 diff
?
我有一个csh脚本(虽然我可以更改语言,如果它有任何相关性)我必须:
sed s/AAA/BBB/ file
Run Code Online (Sandbox Code Playgroud)
问题是AAA和BBB是路径,因此包含'/'.AAA是固定的,所以我可以说:
sed s/\\\/A\\\/A\\\A/BBB/ file
Run Code Online (Sandbox Code Playgroud)
但是,BBB基于变量,包括$ PWD.如何逃避$ PWD中的'/'?
还有其他方法我应该完全这样做吗?
基本上我想做以下事情:
ls -l[+someflags]
Run Code Online (Sandbox Code Playgroud)
(或通过其他方式)只显示符号链接的文件
所以输出看起来
-rw-r--r-- 1 username grp size date-time filename -> somedir
-rw-r--r-- 1 username grp size date-time filename2 -> somsdfsdf
Run Code Online (Sandbox Code Playgroud)
等等
例如,
仅显示我有别名的目录:
alias lsd 'ls -l | grep ^d'
Run Code Online (Sandbox Code Playgroud)
我想知道如何只显示隐藏文件或只隐藏目录?
我有以下解决方案,但它不显示颜色的输出:(
ls -ltra | grep '\->'
Run Code Online (Sandbox Code Playgroud)