标签: ksh

在ksh ENV脚本中检测交互式shell

确定给定的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)

unix shell ksh

5
推荐指数
2
解决办法
5418
查看次数

是否有用于遍历类似目录结构的Bash快捷方式?

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以同样的方式工作的黑客攻击呢?

bash shell scripting ksh

5
推荐指数
1
解决办法
836
查看次数

如何在expect脚本中刷新输入缓冲区?

我正在写一个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关闭一些更烦人的交互功能(如水平滚动) .

ksh expect

5
推荐指数
1
解决办法
2万
查看次数

将通配符传递给别名

我使用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/*执行带有一些选项的列表命令并显示完整路径,这对我来说非常重要.

不幸的是,别名方法不允许使用通配符参数.我的目标是使这成为可能.可能这是将命令创建为函数的最佳方法.这在答案中提到,但它还没有工作(见评论).

有任何想法吗?

unix shell ksh

5
推荐指数
1
解决办法
3916
查看次数

在shell脚本中禁止输出到屏幕

嗨我写了一个小脚本:

#!/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

这怎么可能?

unix shell awk ksh

5
推荐指数
1
解决办法
8751
查看次数

我应该使用$(())来计算ksh中的算术表达式吗?

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

unix ksh

5
推荐指数
1
解决办法
4826
查看次数

Awk和多文件处理可能吗?

我需要处理两个文件内容.我想知道我们是否可以使用一个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美元.等.....

unix file-io awk ksh nawk

5
推荐指数
2
解决办法
8598
查看次数

如何删除ksh中字符串变量的最后一个字符?

我有一个字符串变量,我想删除它的最后一个字符.

例如:从"testing1"传递到"testing".

我怎样才能在KSH中做到这一点?

string variables ksh var

5
推荐指数
1
解决办法
2万
查看次数

如何从给定时间戳中查找超过N天的文件

我想从格式为YYYYMMDDHH的给定时间戳中查找超过N天的文件

我可以使用以下命令找到超过2天的文件,但是这会查找具有当前时间的文件:

find /path/to/dir -mtime -2 -type f -ls
Run Code Online (Sandbox Code Playgroud)

让我们说我timestamp=2011093009要输入我想要查找2011093009之前2天以上的文件.

一直在做我的研究,但似乎无法搞清楚.

unix shell ksh find

5
推荐指数
1
解决办法
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)

unix shell ksh solaris

5
推荐指数
1
解决办法
141
查看次数

标签 统计

ksh ×10

unix ×7

shell ×6

awk ×2

bash ×1

expect ×1

file-io ×1

find ×1

nawk ×1

scripting ×1

solaris ×1

string ×1

var ×1

variables ×1