Articles of shell

用基于匹配组的评估stringreplacestring(优雅的方式,而不是用于…)

我正在寻找一种方法来replace正则expression式匹配的文件的string与另一个string,这些string将从匹配的string中生成/评估。 例如,我想要replace此文件中的时间戳(时间戳+持续时间) 1357222500 3600 … Maybe intermediate strings… 1357226100 3600 … Maybe intermediate strings… … 由人类可读的date表示(date范围)。 到目前为止,我总是使用像Bash这样的shell脚本遍历每行,匹配X行,得到匹配的组string,并在处理后打印行,例如这样(从内存中): IFS=" " for L in `cat file.txt`; do if [[ "${L}" =~ ^([0-9]{1,10})\ ([0-9]{1,4})\ .*$ ]]; then # Written as three lines for better readability/recognition echo -n "`date –date=@${BASH_REMATCH[1]}` – " echo -n "`date –date=@$(( ${BASH_REMATCH[1]} + ${BASH_REMATCH[2]} […]

编写linux shell

我正在学习Unix C并为练习做一些练习。 我目前正在编写我自己的shell,其工作方式类似于linux bash shell。 我下面的代码提供了一个相当基本的shell。 它现在提供I / Oredirect。 我正在尝试添加对pipe道的支持。 最初,我只想添加对单个pipe道的支持。 我试图通过一些在线教程,但不能完全弄清楚从哪里开始。 目前,下面的shell可以处理下面的命令命令。 ls> abc,cat <file1> file2等 #include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <sys/types.h> #include <string.h> #include <sys/wait.h> #include <fcntl.h> #define TRUE 1 int main(void) { char *arg_list[10]; int status; int counter = 0; int counter2 = 0; pid_t pid; char buf[100]; char inFile[10]; […]

Java Process无法通过Runtime.getRunTime()。exec()获取InputStream

try { String str; Process process = Runtime.getRuntime().exec("bash /home/abhishek/workspace/Pro/run"); InputStream isout = process.getInputStream(); InputStreamReader isoutr = new InputStreamReader(isout); BufferedReader brout = new BufferedReader(isoutr); while ((str = brout.readLine()) != null) { System.out.println(str); } } catch (IOException e) { e.printStackTrace(); } 该代码有从进程中获取InputStream的问题,因为如果我从我的terminal运行Shell脚本它运行完全正常,但如果我像这样运行脚本,str始终为空, 我正在使用此代码将Shell脚本的输出直接input到Java中,而不是将脚本输出写入文件中 有没有其他办法可以做到这一点,或者我怎样才能解决问题使用目前的做法

如何在单独的进程中运行一个shell并获得自动完成? (python)

我有一个Linux应用程序,从一些设备获取inputstream。 这个input应该被引导到一个shell进程,以便它模拟给用户一个标准的shell。 到目前为止,我已经通过创build运行'/ bin / sh'的进程来完成它,并且我redirect了其input,输出和stderr,如下所示: import subprocess p = subprocess.Popen(shell=False, args=['/bin/sh'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) _make_nonblocking(p.stdout) # sets O_NONBLOCK _make_nonblocking(p.stderr) 当我只是一个通行命令,一切正常。 p.stdin.write('pwd\n') p.stdout.read() '/home/dave\n' 对于自动完成,我试图写: p.stdin.write('ls s\t') p.stdout.read() IOError: [Errno 11] Resource temporarily unavailable 我希望得到一个可能的完成列表,但没有任何反应,直到我把“\ N”在标准input。 (另外,stderr没有什么等待)。 我已经查看了telnetd代码,并看到使用pty。 我尝试使用pty.openpty()并将slave设置为stdin,但是这也不起作用。 应该怎么办? 更新:我用build议的-i参数。 现在我有一个问题,一旦我使用Popen,然后按ENTER键,python shell移动到后台,如下所示: >>> p = subprocess.Popen(shell=False, args=['/bin/sh', '-i'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) >>> <ENTER> [1]+ […]

如何忽略脚本中的stdininput

我有一个程序“myprogram”,它在控制台上运行时等待input密钥。 我们按下某个键后,退出。 我想在后台运行这个myprogram并忽略stdininput。 我有一个简单的脚本, sample.sh脚本 —— ./myprogram & exit 0 —— 但是当我跑步的时候, %sh sh sample.sh 一些如何myprogram得到一些input从标准input和退出..我想停止从任何input从标准input,所以即使在sample.sh退出myprogram继续运行。 请build议如何更新sample.sh脚本来实现此目的。

在bash中从python函数收集返回值

我正在实现一个将调用python脚本的函数/方法的bash脚本。 我想收集这个函数的返回值到调用bash脚本中的局部variables。 try1.sh包含: #!/bin/sh RETURN_VALUE=`python -c 'import try3; try3.printTry()'` echo $RETURN_VALUE 现在python脚本: #!/usr/bin/python def printTry(): print 'Hello World' return 'true' 关于删除bash脚本: $./tr1.sh Hello World 没有“真”或在那个地方任何其他types的回声标准输出所需。 另外一件事,我希望能够做的是,我的avtual python代码将有大约20-30个函数返回我的软件状态机的各种状态值,我会从bash脚本中调用这些函数。 在bash脚本中,我必须将这些返回值存储在本地variables中,这些variables将在调用bash脚本中实现的状态机逻辑中进一步使用。 对于每个值,我会做python -c'import python_module; python_module.method_name',这将重新枚举一次又一次,我不想要的状态机的定义状态。 我想避免使整个python脚本只用于调用一个函数。 那可能吗? 在这里可以想到什么可能的解决scheme/build议/想法? 我将不胜感激。 为了阐明我的意图,任务是让python脚本replace一部分bash脚本以提高可读性。 bash脚本实际上非常大(约15000行),因此不能完全由一个单独的python脚本replace。 所以可以被改进的部分可以被python替代。 另外,我曾想过在下面的评论中用Victor的build议来replace整个bash脚本,但是在我的情况下这是不可行的。 因此,我将不得不将状态机分成bash和python,其中python将有一些必需的方法返回bash脚本所需的状态值。 问候,优素福Husainy。

基于文件系统中的位置的Shell提示符

我必须在根文件系统下的三个主目录下工作 – home / username,project和scratch。 我想我的shell提示符显示我在哪些顶级目录。 这是我正在做的事情: top_level_dir () { if [[ "${PWD}" == *home* ]] then echo "home"; elif [[ "${PWD}" == *scratch* ]] then echo "scratch"; elif [[ "${PWD}" == *project* ]] then echo "project"; fi } 然后,我将PS1导出为: export PS1='$(top_level_dir) : ' 不幸的是,这不是我想要的。 我home :为我的提示,当我在我的家目录,但如果我切换到草稿或项目,然后提示不会改变。 我不明白bash脚本很好,所以我将不胜感激任何帮助来纠正我的代码。

为什么期望让过程打开它的STDERR?

我想为一个进程设置超时,这是我的shell。 我使用期望来做到这一点,以避免其他软件包的依赖。 test.sh #!/bin/bash # $1 timeout in seconds # $2 command timeout() { time=$1 shift # start the command in a subshell to avoid problem with pipes # (spawn accepts one command) -noecho command="/bin/sh -c \"$*\"" expect -c "set echo \"-noecho\";set timeout $time; spawn -noecho $command; expect timeout { exit 1 } eof { […]

md5sum linux命令是否正常工作?

根据维基百科,一个空string的md5总和是d41d8cd98f00b204e9800998ecf8427e 我用我的md5库证实了这一点 但是,当我跑步 echo "" | md5sum 在我的linux shell中,我得到了68b329da9893e34099c7d8ad5cb9c940 – 实际上,我的散列都不匹配md5sum命令的输出。 有关这种差异的想法?

如何把所有的命令参数放在一个variables中

我想执行一个需要3个参数的shell脚本。 参数2包含一个带空格的string 我想把所有的参数放在一个像这样的variables中: Linux:~# kk="\"111\" \"222 222\" \"333\"" Linux:~# echo $kk "111" "222 222" "333" 现在,如果我调用一个函数: func() { echo —$1— echo —$2— echo —$3— } 用这种方法$ kkvariables func $kk 然后它会返回 Linux:~# func $kk —"111"— —"222— —222"— 我期待得到这个结果 —111— —222 222— —333— 如何解决这个问题,而不使用eval ? 我知道eval解决这个问题,但我不想使用它(因为如果我执行这样的调用很多时间需要时间)。