Questions tagged «shell»

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


21
为终端和外壳环境着色?
我大部分时间都在Unix环境中工作,并使用终端仿真器。我尝试在命令行上使用color,因为color使输出更加有用和直观。 有哪些选项可为终端环境添加颜色?您使用什么技巧?您遇到了什么陷阱? 不幸的是,对颜色的支持因终端类型,操作系统,TERM设置,实用程序,错误的实现等而异。 经过大量实验,以下是我设置中的一些提示: 我倾向于设置TERM=xterm-color,大多数主机(但不是全部)都支持。 我在许多不同的主机,不同的OS版本等上工作。我使用macOS X,Ubuntu Linux,RHEL / CentOS / Scientific Linux和FreeBSD中的所有内容。如果可能的话,我试图使事情变得简单而通用。 我使用GNU进行了大量工作screen,这又增加了一层乐趣。 许多操作系统dircolors在默认情况下会设置和,并且我不想在一百台不同的主机上进行修改。因此,我尝试使用默认值。相反,我调整了终端的颜色配置。 对于一些使用颜色Unix命令(ls,grep,less,vim)和Bash提示符。这些命令似乎使用标准的“ ANSI转义序列 ”。例如: alias less='less --RAW-CONTROL-CHARS' export LS_OPTS='--color=auto' alias ls='ls ${LS_OPTS}' 我将发布帖子.bashrc并回答我自己的问题《危险风格》。
262 shell  bash  colors  prompt 


3
Shell的控制和重定向运算符是什么?
我经常在网上看到教程,这些教程将各种命令与不同的符号相连。例如: command1 | command2 command1 & command2 command1 || command2 command1 && command2 其他人似乎正在将命令连接到文件: command1 > file1 command1 >> file1 这些是什么东西?他们叫什么?他们在做什么?还有更多吗? 有关此问题的元线程。。


6
Bash运算符[[vs [vs(vs((??
对于在bash中使用这些运算符(括号,双括号,括号和双括号)有何不同之处,我有些困惑。 [[ , [ , ( , (( 我见过人们在if语句上使用它们,例如: if [[condition]] if [condition] if ((condition)) if (condition)
243 bash  shell  test 

8
如何测试变量是否为空或仅包含空格?
以下bash语法验证是否param不为空: [[ ! -z $param ]] 例如: param="" [[ ! -z $param ]] && echo "I am not zero" 没有输出,它的罚款。 但是,当param一个(或多个)空格字符为空时,情况就不同了: param=" " # one space [[ ! -z $param ]] && echo "I am not zero" 输出“我不为零”。 如何更改测试以将仅包含空格字符的变量视为空?


3
忘记在bash / POSIX shell中引用变量的安全隐患
如果您已经关注unix.stackexchange.com一段时间了,那么您现在应该希望知道,echo $var在Bourne / POSIX shell(zsh是例外)的列表上下文中(如)在列表上下文中不加引号的变量具有非常特殊的含义,并且除非您有充分的理由,否则不应该这样做。 在此处的许多问答中对此进行了详细讨论(示例:为什么我的shell脚本为什么在空格或其他特殊字符上感到窒息?,何时需要双引号?,shell变量的扩展以及glob对其的影响和split,引用vs无引号的字符串扩展) 自从70年代末Bourne shell首次发布以来就是这种情况,但Korn shell(David Korn的最大遗憾之一(问题#7))并没有改变它,或者bash主要是复制了Korn shell,这就是POSIX / Unix如何指定的。 现在,我们仍然在这里看到许多答案,甚至偶尔看到一些不引用变量的公开发布的shell代码。您可能以为人们现在已经学到了。 根据我的经验,主要有3种类型的人忽略了引用其变量: 初学者。可以原谅这是完全不直观的语法。这是我们在此站点上进行教育的职责。 健忘的人。 甚至在反复敲打之后仍然没有被说服的人,他们认为Bourne shell的作者肯定不打算让我们引用所有变量。 如果我们暴露与此类行为相关的风险,也许我们可以说服他们。 如果忘记引用变量,最糟糕的事情莫过于发生。真的那么糟糕吗? 我们在这里谈论什么样的漏洞? 在什么情况下会出现问题?

8
为什么*不*解析`ls`(以及怎么做)?
我一直看到答案引用此链接,并明确声明“请勿解析ls!”。这使我感到烦恼有两个原因: 似乎可以毫无疑问地完全接受了该链接中的信息,尽管我可以从随意阅读中至少挑出一些错误。 似乎该链接中提到的问题似乎没有激发寻求解决方案的欲望。 从第一段开始: ...当您请求[ls]文件列表时,存在一个巨大的问题:Unix允许文件名中的几乎所有字符,包括空格,换行符,逗号,管道符号以及几乎您尝试用作的任何其他内容。除NUL外的定界符。... ls用换行符分隔文件名。除非您的文件名中包含换行符,否则这没问题。而且由于我不知道有任何实现ls允许您使用NUL字符而不是换行符来终止文件名,因此我们无法使用来安全地获取文件名列表ls。 兄弟,对吗?如何以往我们可以处理一个换行符终止可能包含换行符数据集上市?好吧,如果在这个网站上回答问题的人们每天都没有做这种事情,我可能会觉得我们遇到了麻烦。 事实是,尽管大多数ls实现实际上提供了一个非常简单的api来解析其输出,我们一直都在做,甚至都没有意识到。您不仅可以以null结尾的文件名,还可以以null或可能需要的任何其他任意字符串开头的文件名。此外,您可以为每个文件类型分配这些任意字符串。请考虑: LS_COLORS='lc=\0:rc=:ec=\0\0\0:fi=:di=:' ls -l --color=always | cat -A total 4$ drwxr-xr-x 1 mikeserv mikeserv 0 Jul 10 01:05 ^@^@^@^@dir^@^@^@/$ -rw-r--r-- 1 mikeserv mikeserv 4 Jul 10 02:18 ^@file1^@^@^@$ -rw-r--r-- 1 mikeserv mikeserv 0 Jul 10 01:08 ^@file2^@^@^@$ -rw-r--r-- 1 mikeserv mikeserv 0 Jul …
204 shell  ls 


4
为什么使用shell循环处理文本被认为是不好的做法?
在POSIX Shell中,通常使用while循环处理文本是否被认为是不好的做法? 正如StéphaneChazelas指出的,不使用shell循环的一些原因是概念,可靠性,易读性,性能和安全性。 此答案解释了可靠性和易读性方面: while IFS= read -r line <&3; do printf '%s\n' "$line" done 3< "$InputFile" 为了提高性能,从文件或管道中读取时,while循环和读取速度非常慢,因为内置的读取外壳一次读取一个字符。 怎么样的概念和安全性方面?


20
如何在简单的Shell脚本中获取发行名称和版本号?
我正在研究一个简单的bash脚本,该脚本应该能够在Ubuntu和CentOS发行版上运行(对Debian和Fedora / RHEL的支持将是一个加号),我需要知道脚本正在运行的发行版的名称和版本(以触​​发特定操作,例如创建存储库)。到目前为止,我所得到的是: OS=$(awk '/DISTRIB_ID=/' /etc/*-release | sed 's/DISTRIB_ID=//' | tr '[:upper:]' '[:lower:]') ARCH=$(uname -m | sed 's/x86_//;s/i[3-6]86/32/') VERSION=$(awk '/DISTRIB_RELEASE=/' /etc/*-release | sed 's/DISTRIB_RELEASE=//' | sed 's/[.]0/./') if [ -z "$OS" ]; then OS=$(awk '{print $1}' /etc/*-release | tr '[:upper:]' '[:lower:]') fi if [ -z "$VERSION" ]; then VERSION=$(awk '{print …
191 shell 


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.