Questions tagged «bash»

与其他Bourne / POSIX shell相对,GNU的Bourne Again SHell特有的问题。对于一般关于Unix shell的问题,请改用/ shell标记。

2
在数组的循环中,向数组添加元素
我对bash中的for循环有问题。例如:我有一个数组("etc" "bin" "var")。我在这个数组上进行迭代。但是在循环中,我想将一些值附加到数组中。例如 array=("etc" "bin" "var") for i in "${array[@]}" do echo $i done 显示etc bin var(当然在单独的行上)。如果我这样追加do: array=("etc" "bin" "var") for i in "${array[@]}" do array+=("sbin") echo $i done 我想要:(etc bin var sbin当然在单独的行上)。 这是行不通的。我该怎么做?
9 bash  array  for 

3
注入行来重击历史
默认情况下,bash将行从加载~/.bash_history到历史记录。是否可以添加要加载的自定义文件?我想注入包含我经常使用的命令的文件,并通过内置搜索访问它们。
9 bash 

1
为什么在引用子shell并将结果传递给echo的末尾没有换行?
当我做ls | grep pnggrep的输出是: 2015-05-15-200203_1920x1080_scrot.png 2015-05-16-025536_1920x1080_scrot.png (文件名,换行符,文件名,换行符) 然后,echo $(ls | grep png)输出: 2015-05-15-200203_1920x1080_scrot.png 2015-05-16-025536_1920x1080_scrot.png (文件名,分词时的空格,文件名,换行!从echo开始!) 没关系,但是当我这样做以防止单词split:时echo "$(ls | grep png)",输出为: 2015-05-15-200203_1920x1080_scrot.png 2015-05-16-025536_1920x1080_scrot.png 我的问题是,第二个换行符在哪里(一个应该来自grep,另一个应该来自echo)?

4
使用CLI按日期将文件移动到其他目录
我要整理的旧硬盘中有大量图片。如果运行ls -l,我注意到所有这些文件的创建日期均为2012年或更早。理想情况下,我想将它们移动到计算机的第二个硬盘驱动器,该硬盘驱动器未设置为自动安装。最好,我可以将某些命令链接在一起,以批处理方式完成所有这些工作。到目前为止,我ls -l | grep -i 2012只在所提供的日期中吐出了2012年的文件ls -l。现在,诀窍是将cp所有这些文件都移到新目录中。我不确定下一步该怎么做,因为每个文件都必须复制。下一组命令是什么?



2
bash如何对待“>>()”
在尝试输出重定向和进程替换时,我偶然发现了以下命令及其结果输出: me @ elem:〜$ echo foo>>(cat); 回声条 酒吧 me @ elem:〜$ foo (是的,最后的空换行是有意的。) 因此,bash echo的栏会显示我通常的提示,echo的foo,echo的换行符,然后将光标留在那里。如果再次按下Enter键,它将在新行上打印提示,并将光标留在它的后面(按预期,当有人在空命令行上按下Enter键时)。 我期望它将foo写入文件描述符,cat读取它并回显foo,第二个回显回显的栏,然后返回命令提示符。但这显然不是事实。 有人可以解释发生了什么吗?

3
为什么此命令不起作用:“ ps aux | grep xscreensaver”
我在Google上没有看到有关此的任何搜索,因此我想问您: 我只是想在ssh会话中运行此命令,本地是Debian Wheezy KDE,远程是Fedora 21 Gnome: ps aux | grep xscreensaver 这是输出: bash: grep: command not found... 我以前从未见过,这是什么原因? 我仅几个小时就更新了系统,但是没有看到任何标记为要删除的软件包。系统上只有两个用户,只有我自己在该系统上安装或删除软件。 编辑#1 这是复制的命令和输出,请注意第二次不存在空格: [root@Hostname ~]# ps aux | grep xscreensaver bash: : command not found... [root@Hostname ~]# ps aux | grep xscreensaver bash: grep: command not found...

2
在运行用户要运行的命令之前,请运行另一个命令
假设我想通过ls这种方式修改工具的原始行为: $ ls Hello World file1 file2 ... 我怎样才能做到这一点? 运行时,ls我想运行另一个命令echo "Hello World!"。 我看到的快速解决方案是使用别名: alias orig_ls="ls" alias ls='echo "Hello World!"' 但是,这不是一个真正的解决方案,因为在我运行orig_ls时它将输出"Hello World!"。

1
bashscript检测右箭头键被按下
为什么即使键码不是右箭头键,它也总是检测为true? stty_state=`stty -g` stty raw; stty -echo keycode=`dd bs=1 count=1 2>/dev/null` stty "$stty_state" echo $keycode if [ "$keycode"=39 ]; then echo "Right Arrow Key Pressed!" fi

2
如果任何产生的子进程失败,请全部杀死并退出
在我的脚本中,我将数据集划分为input_aa,input_ab等。然后,我通过相同的Python脚本运行每个数据集,如下所示: # Execute program on each split file for part in input_*; do python3 $part & done wait 我的问题有两个:如何检测到Python进程已失败,如何检测到该错误,如何杀死所有产生的子代并失败退出脚本?
9 bash  shell  python 


2
我如何有条件地将子壳传递给“时间”?
我有一个Vagrant框的设置脚本,该脚本过去曾用来测量单个步骤time。现在,我想有条件地启用或禁用时间测量。 例如,以前的一行如下所示: time (apt-get update > /tmp/last.log 2>&1) 现在我以为我可以做这样的事情: MEASURE_TIME=true [[ $MEASURE_TIME = true ]] && TIME="time --format=%e" || TIME="" $TIME (apt-get update > /tmp/last.log 2>&1) 但这不起作用: syntax error near unexpected token `apt-get' `$TIME (apt-get update > /tmp/last.log 2>&1)' 这是什么问题
9 bash  shell  quoting  time 

5
我可以插入cd命令吗?
我试图在我运行的服务器上进行设置,每当我cd有public_html95%的时间进入文件夹时,总会运行一些命令来检查某些内容。 无论如何,我都可以挂入,cd所以如果目录是a public_html,它将为我自动运行命令? 如果我无法使用cd命令,是否还有其他事情可以实现,以达到所需的结果? 我正在运行CentOS 5.8。

2
管道bash字符串操作
我读过其他一些管道bash字符串操作问题,但它们似乎是专门的应用程序。 从本质上讲,有没有一种方法可以使以下操作更简单? 代替 $ string='hello world'; string2="${string// /_}"; echo "${string2^^}" HELLO_WORLD 就像是 $ echo 'hello world' | $"{-// /_}" | "${ -^^}" HELLO_WORLD 编辑我有兴趣尽可能保持bash操纵以保持速度(与sed / awk相反,后者往往会大大减慢我的脚本的速度) Edit2:@jimmij 我喜欢第二个示例,并引导我编写了一个函数。 bash_m() { { read x; echo "${x// /_}"; } | { read x; echo "${x^^}"; }; } echo hello world | bash_m …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.