确定给定的ksh调用是否正在运行交互式shell的首选方法是什么?
我在一个ENV文件中有一些命令,我想跳过非交互式ksh调用(例如,在执行shell脚本时).
我见过建议范围从:
if [[ $- = *i* ]]; then
# do interactive stuff
fi
Run Code Online (Sandbox Code Playgroud)
... .kshrc除非使用这个神秘的咒语确定壳是交互式的,否则甚至不采购:
ENVIRON=$HOME/.kshrc export ENVIRON
ENV='${ENVIRON[(_$-=1)+(_=0)-(_$-!=_${-%%*i*})]}' export ENV
Run Code Online (Sandbox Code Playgroud) KornShell(ksh)曾经有一个非常有用的选项来cd遍历类似的目录结构; 例如,给出以下目录:
/home/sweet/dev/projects/trunk/projecta/app/models /home/andy/dev/projects/trunk/projecta/app/models然后,如果您在/home/sweet...目录中,则可以通过键入更改为andy结构中的等效目录
cd sweet andy
Run Code Online (Sandbox Code Playgroud)
因此,如果ksh看到2个参数,那么它将扫描当前目录路径中的第一个值,将其替换为第二个和cd.有人知道Bash内置了类似的功能吗?或者如果没有,那么让Bash以同样的方式工作的黑客攻击呢?
我正在写一个Expect脚本,但是在处理shell提示符时遇到了麻烦(在Linux上).My Expect脚本生成rlogin并且远程系统正在使用ksh.远程系统上的提示包含当前目录,后跟" > "(空间大于空格).脚本代码段可能是:
send "some command here\r"
expect " > "
Run Code Online (Sandbox Code Playgroud)
这适用于简单的命令,但是当我发送的命令超过终端的宽度时(或更确切地说,ksh认为是终端的宽度),事情开始出错.在这种情况下,ksh交互式命令行的一些奇怪的水平滚动,似乎重写提示并在输出中粘贴额外的">".当然,这会导致Expect脚本在执行命令后输出中出现多个提示时出现混淆和不同步(我的脚本包含多个send/ expect对).
我已经尝试将PS1远程系统更改为更具特色的"提示>",但是出现了类似的问题,这表明我不是解决这个问题的正确方法.
我正在想的可能是帮助脚本能够告诉Expect"我知道此时我已经与远程系统正确同步,因此现在刷新输入缓冲区." 该expect语句具有不丢弃输入缓冲区的-notransfer标志,即使模式匹配,所以我认为我需要与之相反.
是否有任何其他有用的技术可以让远程shell表现得更具可预测性?据我所知,Expect经历了大量的工作,以确保生成的会话似乎与远程系统交互,但我宁愿ksh关闭一些更烦人的交互功能(如水平滚动) .
我使用modifies list命令作为别名(在KSH中):
alias ltf='ls -lrt -d -1 $PWD/*'
所以命令ltf显示如下:
-rw-r--r-- 1 myuser mygroup 0 Apr 18 12:00 /usr/test.txt
-rw-r--r-- 1 myuser mygroup 0 Apr 18 12:00 /usr/test.log
现在我想使用通配符.但使用ltf *.log不起作用.
实现这一目标的最佳方法是什么?
更新:我想指定我的问题,因为到目前为止答案并没有解决我的问题:该命令ls -lrt -d -1 $PWD/*执行带有一些选项的列表命令并显示完整路径,这对我来说非常重要.
不幸的是,别名方法不允许使用通配符参数.我的目标是使这成为可能.可能这是将命令创建为函数的最佳方法.这在答案中提到,但它还没有工作(见评论).
有任何想法吗?
嗨我写了一个小脚本:
#!/usr/bin/ksh
for i in *.DAT
do
awk 'BEGIN{OFS=FS=","}$3~/^353/{$3="353861958962"}{print}' $i >> $i_changed
awk '$3~/^353/' $i_changed >> $i_353
rm -rf $i_changed
done
exit
Run Code Online (Sandbox Code Playgroud)
我测试了它和它的wrking罚款.但是它将输出提供给屏幕我不需要输出到屏幕.我只需要制作最终文件$i_353
这怎么可能?
1)如果我操作整数,我应该使用$(())吗?
>typeset -i x=0
>typeset -i y=0
>typeset -i z=0
>y=$(($x+1))
>print $y
1
>z=$x+1
>print $z
1
Run Code Online (Sandbox Code Playgroud)
如您所见,z和y都有正确的结果.
仅在变量未声明为整数的情况下才有区别:
>typeset j
>typeset k
>j=$(($x+1))
>print $j
1
>k=$x+1
>print $k
0+1
Run Code Online (Sandbox Code Playgroud)
2)$(($ x + 1))和$((x + 1))之间有什么区别?
print $(($ x + 1))
1
print $((x + 1))
1
let有同样的情况:
x = 1
让x = $ x + 1
打印$ x
2
让x = x + 1
打印$ x
3
我需要处理两个文件内容.我想知道我们是否可以使用一个nawk声明来解决它.
文件A内容:
AAAAAAAAAAAA 1
BBBBBBBBBBBB 2
CCCCCCCCCCCC 3
Run Code Online (Sandbox Code Playgroud)
文件B内容:
XXXXXXXXXXX 3
YYYYYYYYYYY 2
ZZZZZZZZZZZ 1
Run Code Online (Sandbox Code Playgroud)
我想比较,如果$2(第二场)在文件中的是相反$2的文件B.我不知道如何写规则NAWK多文件处理?我们如何将A $2与B 区分开来$2
编辑:我需要将A的第一行(即1)的2美元与B的最后一行(再次为1)的2美元进行比较.然后比较A中第2行的2美元和第2行的第2行中的2美元.等.....
我有一个字符串变量,我想删除它的最后一个字符.
例如:从"testing1"传递到"testing".
我怎样才能在KSH中做到这一点?
我想从格式为YYYYMMDDHH的给定时间戳中查找超过N天的文件
我可以使用以下命令找到超过2天的文件,但是这会查找具有当前时间的文件:
find /path/to/dir -mtime -2 -type f -ls
Run Code Online (Sandbox Code Playgroud)
让我们说我timestamp=2011093009要输入我想要查找2011093009之前2天以上的文件.
一直在做我的研究,但似乎无法搞清楚.
我在shell脚本中遇到问题.我缩小了问题的范围,发现这是因为标准输入的文件描述符不是在proc文件系统中生成的.下面是我编写的测试脚本:
#!/bin/ksh
var=`ls -lrt /proc/$$/path/0`
echo $var
if [[ -f /proc/$$/path/0 ]]
then
echo "found file descriptor"
else
echo "file descriptor not found"
fi
Run Code Online (Sandbox Code Playgroud)
我在/ tmp /目录中使用示例输入文件对此进行了测试:
$ ./checkip.sh < /tmp/testip
lrwxrwxrwx 1 root root 0 Dec 31 09:15 /proc/19358/path/0 -> /tmp/testip
found file descriptor
Run Code Online (Sandbox Code Playgroud)
现在我在我们遇到问题的目录中进行了测试.
$ ./checkip.sh < /var/opt/xxxxxxxx/testip
lrwxrwxrwx 1 root root 0 Dec 31 09:15 /proc/20124/path/0
file descriptor not found
$
Run Code Online (Sandbox Code Playgroud)
我想可能是目录xxxxxxxx.所以我再次使用父目录中的文件对此进行了测试.
$ ./checkip.sh < /var/opt/testip
lrwxrwxrwx 1 root root 0 Dec 31 09:16 /proc/21286/path/0 -> /var/opt/testip …Run Code Online (Sandbox Code Playgroud)