Questions tagged «shell»

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


3
最佳做法是使用$?猛击?
当我阅读有关$的答案时?另一个问题浮现在脑海。 是否有使用$的最佳做法?猛击? 让我们举个例子: 我们有一个线性脚本,我想知道所有命令都已正确执行。您是否认为可以调用一个小函数(将其称为“ did_it_work”)以检查错误代码,如果不是,则将其中断。 #!/bin/bash function did_it_work { code=$1 if [ "$code" -ne "0" ] then echo "Error failure: code $code " exit 1 fi } dir=some/path mkdir -p $dir did_it_work $? cd $dir did_it_work $? run_some_command did_it_work $? 当然,这种方法意味着我必须手动解决问题(如果有)并重新运行脚本。 您认为这是个好主意还是有其他最佳做法呢? /谢谢

5
IFS(内部字段分隔符)可以用作多个连续定界符char的单个分隔符吗?
使用具有非空格值的IFS解析数组会创建空元素。 即使使用tr -s将多个delims缩小到一个delim是不够的。 有一个示例可以更清楚地说明问题。. 是否有一种方法可以通过对IFS进行调整来实现“正常”结果(是否有相关的设置来更改IFS的行为?....即,与默认空白相同) IFS。 var=" abc def ghi " echo "============== IFS=<default>" arr=($var) for x in ${!arr[*]} ; do echo "# arr[$x] \"${arr[x]}\"" done # sfi="$IFS" ; IFS=':' set -f # Disable file name generation (globbing) # (This data won't "glob", but unless globbing # is actually needed, …
10 bash  shell  scripting 

5
通过ssh启动文件
在启动任何sh shell之前,我需要执行一些重要命令。这是在SSH命令(ssh host somecommand)和其他运行命令的程序中传递SSH命令所必需的。 在我.profile有这个: ihammerhands@wreckcreations:~> cat .profile #specific environment and startup programs export PS1="\u@wreckcreations:\w> " export PYTHONPATH=~/python/lib/python2.4/site-packages export PATH=$PATH:~/bin:~/python/bin 但是,这失败了: W:\programming\wreckcreations-site\test-hg>ssh name@host echo $PATH Enter passphrase for key '/home/Owner/.ssh/id_rsa': /usr/local/bin:/bin:/usr/bin 注意缺少的PATH选项 sh配置文件的专有名称是什么?注意:我没有root访问权限,并且不希望将此权限应用于其他用户。还有另一种方法吗? 编辑:似乎/bin/sh链接到bash,这并不奇怪。令人惊讶的是,我的个人资料仍然被忽略。有什么建议?
10 bash  ssh  shell  profile 



2
括号命令组为什么在POSIX Shell语法中的左括号之后需要空格?
TL; DR:为什么POSIX大括号组在{保留字之后需要空格,但是在保留字之后不需要subshel​​l (? POSIX Shell语法定义了括号组和子shell,如下所示 brace_group : Lbrace compound_list Rbrace subshell : '(' compound_list ')' 现在,如果从字面上看,空格是很重要的。这将意味着必须有空间来描述开括号和闭括号以及括号,如 { echo hello world; } ( echo hello world ) 这也将与“ 复合命令”定义保持一致: 这些复合命令中的每一个在开头都有一个保留字或控制运算符,在结尾处有一个对应的终止符保留字或运算符。 但是,没有意义的是为什么(list)并且可以( list )正常工作((不需要后面的空格),但是括号扩展必须有一个前导空格,即{echo hello;}不起作用。 当然,保留字被视为空壳字会有意义,之后需要一个空格以与字段拆分的概念保持一致,但是定义本身并未提及空格。此外,如果POSIX的复合命令定义都将{和(都视为保留字,那么为什么在这些保留字之后的空格字符方面会有不同的对待?现在,ksh(1)手册确实指出: 单词是字符序列,由无引号的空格字符(空格,制表符和换行符)或元字符(<,>,|,;,&,(和))定界 换句话说,有意义的是ksh将被识别(为单词定界符,其中第一个单词将是命令或变量赋值。POSIX,但是似乎没有提到(元字符。就POSIX语法而言,我发现的唯一可能的解释是{被认为是“令牌”,此处(未列出为一个。 /* These are reserved words, not operator tokens, and are recognized when reserved words …
10 shell  posix  subshell  syntax 


6
在shell脚本中找出用户的默认shell
我想知道是否有办法在Shell脚本中找出当前用户的默认Shell? 用例:我正在为脚本设置脚本,该脚本为命令设置别名,并且此别名是在Shell脚本中设置的。 !# /bin/bash alias = 'some command to set the alias' 脚本中有一种逻辑,它试图找到执行脚本的用户的默认外壳并将此别名添加到各自的〜/ .bashrc或〜/ .zshrc文件中 但是,当我在脚本的前面添加一个shebang并明确要求它使用bash时,尽管我在ZSH终端上执行此脚本,但此处发布的答案始终会按预期返回bash。 有没有一种方法可以获取执行脚本的shell类型,而与shebang设置无关? 我正在寻找一种适用于Mac和所有基于Linux的小酒馆的解决方案。

5
彩色grep输出:不是GREP_OPTIONS不是别名
我想要彩色输出grep。 ....但是 策略1:GREP_OPTIONS。但这已被弃用。参见http://www.gnu.org/software/grep/manual/html_node/Environment-Variables.html 战略2:乍看之下,GREP_COLORS看起来像是解决方案,但这却有所不同。 策略3:别名。这不适用于find ... | xargs grep,因为xargs不评估别名。 策略4:编写一个简单的包装脚本。不,我认为这太脏了,麻烦多于解决。 策略5:修补源代码 策略6:联系grep开发人员,要求更换GREP_OPTIONS NICE-and-EASY策略:...这是丢失的。我没有任何线索。 如何解决呢? 感谢您的帮助! ...但是我不能给赏金 骂我粗鲁,傲慢,侮辱,辱骂.... 我只看到解决方法-没有解决方案。没有答案满足了这个问题。 感谢你付出的努力。
10 shell  grep  colors 

5
通用的非bash时间基准替代方案?[关闭]
已关闭。这个问题需要细节或说明。它当前不接受答案。 想改善这个问题吗?添加详细信息并通过编辑此帖子来澄清问题。 3年前关闭。 为了比较不同外壳之间脚本的运行时间,一些SE答案建议使用bash的内置 time命令,如下所示: time bash -c 'foo.sh' time dash -c 'foo.sh' ... 等,每个要测试的外壳。这样的基准测试无法消除每个shell加载和初始化自身所花费的时间。例如,假设上述两种命令被存储在一缓慢的设备具有早期软盘的读取速度,(124KB /秒), dash(一〜150K可执行程序)将加载大约7倍的速度比bash(〜1M),所述壳加载时间会使time数字产生偏差-这些外壳的预加载时间与加载foo.sh外壳后测量每个外壳下的运行时间无关。 什么是可以在每个Shell中运行的用于脚本计时的最佳便携式和通用工具?因此,上面的代码如下所示: bash -c 'general_timer_util foo.sh' dash -c 'general_timer_util foo.sh' 注意:因为没有可移植的或通用的命令,所以没有外壳内置 time命令。 更好的是,该实用程序还能够对Shell内部命令和管道所花费的时间进行基准测试,而无需用户先将它们包装在脚本中。这样的人工语法会有所帮助: general_timer_util "while read x ; do echo x ; done < foo" 一些shell time可以管理这个。例如bash -c "time while false ; do : …

2
无法执行/ bin / false:没有这样的文件或目录
我正在尝试在Mac OS上使用以下命令打开GNU屏幕: host:~ user$ screen 屏幕终端打开,但很快死于错误消息: 无法执行/ bin / false:没有这样的文件或目录 我的终端配置为bash在启动时打开外壳。我尝试将终端外壳设置为sh,它给出了相同的错误。 但是,当我screen以as身份执行命令时sudo,命令将成功执行。 如何为普通用户解决此问题?
10 bash  shell  osx 


1
bashrc惰性替换
如何在运行时而不是在执行〜/ .bashrc时(打开终端时)获得~/.bashrc别名来评估$()替换? 我经常运行此命令,以便为其添加别名: svn diff -r $(svn info | grep ^Revision | awk {'print $2'}):HEAD $(svn info | grep ^URL | awk {'print $2'}) | colordiff 但是,当我将其添加~/.bashrc为别名时,我看到评估被硬编码为它们在打开终端时所具有的值: $ alias alias svnbranch='svn diff -r 178184:HEAD svn+ssh://branches/t4252 | colordiff' 如果我在其中打开终端,~则会收到错误消息: svn: E155007: '/home/dotancohen' is not a working copy svn: E155007: '/home/dotancohen' is …
10 bash  shell  quoting  alias  bashrc 

2
清除所有变量而不关闭终端
我想知道如何清除我在命令提示符下定义的所有变量而不关闭终端吗? 例如,如果我在命令提示符下将变量设置为: $ a=1 现在,我想删除变量$a(以及许多其他以类似方式定义的变量)而不关闭终端。我可以使用,unset但是如果没有大的话,那将会很忙。变量

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.