标签: ksh

如何在一段时间后使 root shell 超时?

有没有办法让 root shell(例如 in gnome-terminal)“超时”,以便在一段时间后不发出任何命令,shell 退出?

我正在寻找适用bash于 Fedora 和kshOpenBSD的解决方案。

bash ksh

15
推荐指数
1
解决办法
2760
查看次数

删除键在命令行上不起作用

**注意:我在 SuperUser 上问了同样的问题,但没有得到任何回应。我现在意识到这是一个更适合这个特定问题的论坛。*

在 ksh shell 中,Delete 键在命令行上无法正常工作。当我按 Delete 时,我得到一个 ~ 。

我如何能:

  1. “删除光标处的字符”的功能绑定 到删除键盘按钮?(Control-D 的行为就像我希望删除按钮起作用一样,而我使用别名的尝试没有成功,而且很可能是幼稚的。)
  2. 将“移至行首”的功能绑定到主键盘按钮?(Control A 现在可以这样做,但我希望 Home 可以这样做。)
  3. 将“移到行尾”的功能绑定到结束键盘按钮?(Control E 现在执行此操作,但我想结束它。)

最终(?)更新

我偶然发现了一些有效的东西,但我不明白为什么。这有效:

bind '^[[3'=prefix-2
bind '^[[3~'=delete-char-forward
Run Code Online (Sandbox Code Playgroud)

根据http://www.qnx.com/developers/docs/6.3.2/neutrino/utilities/k/ksh.html#bind

prefix-2
Key binding: ^X, ^[[
Introduces a 2-character command sequence.
Run Code Online (Sandbox Code Playgroud)

所以我更新的问题是为什么我需要使用prefix-2它?请帮我翻译,这样我就可以理解了,这样我就不必再为这件事烦扰大家了。

旧的东西如下

更新

事实证明,QNX 中的 ESC 是^[. 使用该命令,bind '^[[3~'='delete-char-backward'我可以让光标用~. 这至少是一些进步——我现在知道如何为 shell拼写Delete Key。我在网上看到的大多数东西都说删除键是^?,但这似乎对我不起作用。另外,我应该提到我正在通过 PuTTy …

keyboard-shortcuts ksh

15
推荐指数
1
解决办法
3万
查看次数

tar 到管道,但将 -v 详细输出与 STDERR 分开

一个普通的 tar 命令

tar cvf foo.tar ./foo >foo.out 2>foo.err
Run Code Online (Sandbox Code Playgroud)

具有三个输出 IO 流

  • 将数据归档到 foo.tar
  • STDOUT 的文件名列表(重定向到 foo.out)
  • STDERR 的错误消息(重定向到 foo.err)

然后我可以检查 foo.err 是否有错误消息,而无需通读文件名列表。

如果我想对存档数据做一些事情(通过 netcat 或特殊压缩程序进行管道传输),我可以使用 tar 的 -f -选项

tar cvf - ./foo 2>foo.err | squish > foo.tar.S
Run Code Online (Sandbox Code Playgroud)

但是现在我的文件名列表与我的错误消息混合在一起,因为 tar 的-v输出显然不能进入 STDOUT(这是存档数据流动的地方),所以 tar 巧妙地将其写入 STDERR。

使用 Korn shell,有没有一种方法可以构造一个命令,将归档流通过管道传输到另一个命令,但仍能将-v输出与任何错误消息分开捕获。

tar io ksh

13
推荐指数
3
解决办法
3937
查看次数

我怎样才能安全地获得 ksh 的版本?

如何从 ksh 脚本中安全地获取 ksh 版本?

我已经看到以下解决方案

  1. ksh --version
  2. echo ${.sh.version}
  3. echo $KSH_VERSION

并且在适当的情况下,每一个都可以正常工作。但是,我关心不完美的情况。

具体来说,我使用的几台机器都有旧版本的 ksh,就我而言,这些机器严重缺乏功能。无论如何,我想(以编程方式)检查版本的原因是查看 ksh 版本是否是功能较弱的版本之一;如果是这样,我想用不那么棒的代码执行一个分支。

然而,在有问题的机器上,shell 的无能扩展到检查版本......

  • 如果我尝试ksh --version,它不会打印任何内容并打开ksh!
  • 如果我尝试echo ${.sh.version}ksh则将其视为不能用2> /dev/null.

    $ echo ${.sh.version} 2> /dev/null  
    ksh: ${.sh.version}: bad substitution
    
    Run Code Online (Sandbox Code Playgroud)
  • 当然echo $KSH_VERSION看起来工作正常——我的意思是它不会崩溃——尽管在这些机器上它是空白的。另外,我看到的地方KSH_VERSION只被设定pdksh

问题:

  • 如何以ksh编程方式安全地检查版本?出于我的目的,我并不真正关心实际的版本号是什么,只关心它是否是ksh.
  • 是否$KSH_VERSION足够好?我的意思是如果它是空白的,那么ksh一定是过时的版本吗?其他论坛是否正确,即使对于较新版本的ksh.
  • 根本就没有办法检查这个吗?

ksh version shell-script portability

13
推荐指数
4
解决办法
2万
查看次数

查找不包含子目录的目录

我写的脚本是ksh。需要在当前目录下直接找到所有只包含文件而不包含子目录的目录名。

我知道我可以使用ls -alR并递归解析第一个字段(d目录)中第一个字母的输出。我认为awk是解析和查找的最佳方式。

例如,ls -al当前目录中的简单输出:

   drwxr-xr-x  22 af      staff    748 18 Mar 22:21 .
   drwxr-xr-x   5 root    admin    170 17 Mar 18:03 ..
   -rw-------   1 af      staff      3 17 Mar 16:37 .CFUserTextEncoding
   drwxr-xr-x   5 af      staff    170 17 Mar 17:12 Public
   drwxr-xr-x   9 af      staff    306 18 Mar 17:40 Sites
   -rw-------   1 af      staff      3 17 Mar 16:37 textd
   …
Run Code Online (Sandbox Code Playgroud)

此输出中有 2 个目录:PublicSites. 该目录Public不包含子目录,但包含Sites。中有 …

ls shell ksh directory find

12
推荐指数
2
解决办法
7481
查看次数

根据大小对所有目录进行排序

我想根据大小对特定目录中的所有目录/文件进行排序(使用du -sh "name")。

我需要将此命令应用于我所在位置的所有目录,然后根据此结果对它们进行排序。我怎样才能做到这一点 ?

ksh disk-usage sort

12
推荐指数
2
解决办法
7797
查看次数

ksh93 如何避免命令替换中的分叉

给定的

cmd='fun(){ echo "$@";  }; fun $(fun $(fun hi))'
Run Code Online (Sandbox Code Playgroud)

贝壳往往需要制作 2 个叉子才能实现

strace-f(){ strace -f "$@" 2>&1; }; 
for sh in dash bash zsh ksh; do 
    printf "$sh\t" ; strace-f $sh -c "$cmd"  |grep -e clone -e fork -c;
done
Run Code Online (Sandbox Code Playgroud)

除了ksh英勇地使它没有分叉一次:

dash    2
bash    2
zsh     2
ksh     0
Run Code Online (Sandbox Code Playgroud)

它是如何做到的?


编辑:

下面是它如何随着一个管道的插入而下降:

cmd='fun(){ echo "$@"| echo "$@";  }; fun $(fun $(fun hi))'
Run Code Online (Sandbox Code Playgroud)

输出:

dash    11
bash    10
zsh     5
ksh     3 
Run Code Online (Sandbox Code Playgroud)

shell ksh fork command-substitution optimization

12
推荐指数
1
解决办法
611
查看次数

防止 SIGINT 传播到父进程

考虑到父程序(可以是 C++ 程序或 Shell 脚本)执行子 Shell 脚本的场景,当我们在执行子 Shell 脚本时点击 Control+C(或任何配置为 INTR 字符的字符), SIGINT 被发送到前台进程组中的所有进程。这包括父进程。

来源:POSIX.1-2008 XBD 第 11.1.9 节

有没有办法覆盖这个默认行为?CHILD 进程单独处理信号而不将其传播给父进程?

参考:堆栈溢出帖子 - 子进程中断时父进程未完成(TRAP INT)

ksh signals aix shell-script trap

11
推荐指数
2
解决办法
7832
查看次数

如何将文件名拆分为变量?

假设我有一个具有以下格式的 csv 文件列表:

INT_V1_<Product>_<ID>_<Name>_<ddmmyy>.csv
ASG_B1_V1_<Product>_<ID>_<Name>_<ddmmyy>.csv
Run Code Online (Sandbox Code Playgroud)

INT_V1_ASG_B1_V1_是固定的,这意味着所有的CSV文件,开始使用它。
如何将文件名拆分为变量?
例如,我想捕获Name并将其分配给一个变量$Name

bash ksh

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

如何将带有grep命令的字符串搜索放入if语句中?

我想在两个文件中搜索多个字符串。如果在两个文件中都找到一个字符串,则做一些事情。如果只在一个文件中找到一个字符串,那么做另一件事。

我的命令是下一个:

####This is for the affirmative sentence in both files
if grep -qw "$users" "$file1" && grep -qw "$users" "$file2"; then

####This is for the affirmative sentence in only one file, and negative for the other one
if grep -qw "$users" "$file1" ! grep -qw "$users" "$file2"; then
Run Code Online (Sandbox Code Playgroud)

否定和肯定这些陈述的方式是否正确?pd 我正在使用 KSH 外壳。

先感谢您。

grep ksh awk text-processing

11
推荐指数
3
解决办法
2295
查看次数