Questions tagged «shell»

Shell是Unix的命令行界面。您可以交互地在外壳程序中键入命令,也可以编写脚本来自动执行任务。使用此标记可解决适用于/ bin / sh和大多数兼容shell(ash,bash,ksh,zsh等)的问题。对于有错误的Shell脚本,请在此处发布之前在http://shellcheck.net中对其进行检查。

1
\ time,t / ime和cd实际做什么?(在外壳中加反斜杠的乐趣)
在讨论/usr/bin/time与内置shell(bash和zsh)之间的区别时time,有人提到一个人可以\time用作get的简写/usr/bin/time。 首先,它似乎是一个不错的无害捷径,但随后出现了一些问题: 为什么也可以t\ime工作? 为什么\cd即使/usr/bin/cd¹都没有更改目录? 显然,\foo这不等于$(which foo)。现在的问题是: \fooshell的POSIX定义是否以任何方式涵盖了bash和zsh中观察到的行为?如果是,为什么它表现得如此? 脚注1:/usr/bin/cd在我的系统上, #!/bin/sh builtin cd "$@"

5
如何将文件中的行按2分组?
我有一个这样的文本文件: a b c d e f g 我如何将这些行分组以获得这样的输出: a-b b-c c-d d-e e-f f-g 我必须在shell(sh,csh,bash)中执行此操作。 我发现了这一点: cat file | xargs -n2 但第一组的最后一个元素没有成为第二个的第一个。

2
之后没有新的别名;
到目前为止,我还认为外壳中的分号(以某种方式)与换行符具有相同的含义。所以我很惊讶 alias <name>=<replacement text>; <name> <name>在下一行中已知时未知。csh,tcsh,sh,ksh和bash相同的行为。至少因为csh直接使用别名或脚本是在semccolon之前来源的,这无关紧要-别名在后面不知道,;但在下一个命令行中是已知的。这是错误还是此行为的目的?
9 shell  alias 

3
bash变量中的新行
我正在尝试在bash变量中存储多行,但是它似乎不起作用。 例如,如果我/bin每行列出一个文件并将其存储在中$LS,那么我$LS将以stdin的形式传递给wc,则该文件始终返回1: $ ls -1 /bin | wc -l 134 $ LS=$(ls -1 /bin); wc -l <<< $LS 1 如果尝试输出到屏幕,则会得到各种结果:将echo所有行打印在一行上,而printf仅打印第一行: #!/bin/bash LS=$(ls -1 /bin) echo $LS printf $LS 那么,bash变量可以包含多行吗?
9 bash  shell  quoting 

3
如何打印带有转义序列的控制字符?
我已经用tput定义了红色 red=$(tput setaf 1) 为我的程序中的警告着色。这工作正常: printf '%sfail\n' "$red" # prints 'fail' in red 但是有一次我想按原样打印转义序列,例如: \ E [31mfail 我该怎么做?我知道printf有一个%q标志,但是它可以逃避其他我不想要的东西。

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,第二个回显回显的栏,然后返回命令提示符。但这显然不是事实。 有人可以解释发生了什么吗?


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

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 

1
ksh93这么快吗?
因此,总的来说,我倾向于寻找sed文本处理工具,尤其是大文件,并且通常避免在shell本身中做这些事情。 我认为,这可能会改变。我在四处闲逛,man ksh我注意到了这一点: <#pattern Seeks forward to the beginning of the next line containing pattern. <##pattern The same as <# except that the por‐ tion of the file that is skipped is copied to standard output. 对现实世界的有用性表示怀疑,我决定尝试一下。我做了: seq -s'foo bar ' 1000000 >file ...对于一百万行数据如下所示: 1foo bar ... 999999foo bar 1000000 …

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。

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.