-bash: [: =: 需要一元运算符。

我有我的 shell 脚本,myscript.sh以下 #!/bin/sh if [ $1 = "-r" ]; then echo "I am here" fi 如果我运行. myscript.sh -r,它与消息配合得很好I am here。 但如果我只是跑. myscript.sh,它抱怨 -bash: [: =: unary operator expected 我的脚本中缺少什么? 答案 您需要添加 1 美元左右的报价。 if [ "$1" = "-r" ]; then echo "I am here" fi 当 $1 为空时,您会得到 if [ = “-r”] 这是一个语法错误。 来自: stackoverflow.com

-bash:__git_ps1:找不到命令

我尝试安装 Ruby 2.0。 -bash: __git_ps1: command not found [11:58:28][whatever@whatever ~]$ 我不知道如何摆脱 __git_ps1 命令未找到错误。 我看见这,但我对命令行还很陌生,所以我自己都很困惑。 有任何想法吗? 答案 BASH 有很多方法可以自动设置提示符,为您提供有用的信息。PS1环境变量。PS1="$ "我的提示将如下所示: $ 信息量不大。 但是,如果我设置PS1=\u@\h: \w$,我的提示现在如下所示: david@vegibank:/usr/bin$ 这告诉我如何登录(\u),我正在使用的机器(\h),以及我所在的目录(\w)。git,如果我所在的 git 分支也是我的提示的一部分,那就太好了。 这正是您的情况.profile, 你的.bashrc文件,你的.bash_login或你的.bash_profile脚本。/etc/profile。 您可以做几件事。 下载缺失的__git_ps1并确保它在你的$PATH环境变量(由上面提到的各种初始化文件的组合设置) 改变你的PS1正在执行的任何初始化文件中的环境变量(我相信它可能是.bash_profile。 只需将其添加为最后一行: PS1="\u@\h:\w\n$ " 所添加的\n在下面的行上打印美元符号提示,如下所示: david@vegibank:/usr/bin $ 我喜欢这样做,因为提示可以相当长和编辑变得棘手的命令行提示符超过30到50个字符。手册页。 如果您发现它有点令人困惑,那么庆幸您没有使用 Kornshell。PS1=\u@\h:\w\n$是的,我将提示设置为: export PS1='$(print -n "`logname`@`hostname`:";if [[ "${PWD#$HOME}" != "$PWD" ]] then; print -n "~${PWD#$HOME}"; else; print -n "$PWD";fi;print "\n$ ")' 来自: stackoverflow.com

:(冒号)GNU Bash 内置函数的用途是什么?

一个不执行任何操作的命令的目的是什么,它只不过是一个注释领导者,但实际上它本身就是一个内置的 shell? 它%27s%20比%20将%20a%20注释%20插入%20你的%20脚本%20by%20大约%2040%%20每%20调用慢%20,%20其中%20可能%20变化%20很大%20取决于%20on%20的%20大小%20% # poor man's delay function for ((x=0;x<100000;++x)) ; do : ; done # inserting comments into string of commands command ; command ; : we need a comment in here for some reason ; command # an alias for `true' while : ; do command ; done 我想我真正想要的是它可能有什么历史应用。 答案 Historically , 伯恩炮弹没有true和false作为内置命令。true相反,只是简单地别名为:, 和false类似的东西let 0。 :略好于true以便移植到古老的 Bourne 衍生的 shell。!管道运营商也不是||列表运算符(就像一些古老的 Bourne shell 的情况一样)。else的条款if语句作为基于退出状态进行分支的唯一方法: if command; then :; else ...; fi 自从if需要一个非空的then子句和注释不算为非空,:充当空操作。...

./configure:/bin/sh^m:不良解释器

我一直在尝试在Fed 12系统上安装LPNG142。对我来说似乎是个问题。我有这个错误 [root@localhost lpng142]# ./configure bash: ./configure: /bin/sh^M: bad interpreter: No such file or directory [root@localhost lpng142]# 我该如何解决?这/etc/fstab文件: # # /etc/fstab # Created by anaconda on Wed May 26 18:12:05 2010 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/VolGroup-lv_root / ext4 defaults 1 1 UUID=ce67cf79-22c3-45d4-8374-bd0075617cc8 /boot ext4 defaults 1 2 /dev/mapper/VolGroup-lv_swap swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 答案 要修复,请使用VI或VIM打开脚本,然后进入VI命令模式(键)Esc键),然后输入:...

.bashrc,.bash_profile和.environment之间有什么区别?

我已经使用了多年来的许多基于 *NIX的系统,而且我使用的每种bash的味道似乎都有不同的算法来决定要运行哪些启动脚本。为了实现任务的目的,例如设置环境变量和别名以及打印启动消息(例如MOTDS),哪个启动脚本是合适的地方? 将东西放入有什么区别.bashrc,,,,.bash_profile, 和.environment?我还看到了其他文件,例如.login,,,,.bash_login, 和.profile;这些有相关吗?在物理上登录时,哪些差异有什么区别,通过SSH远程登录并打开一个新的终端窗口?平台之间是否存在任何显着差异(包括Mac OS X(及其终端)和Cygwin Bash)? 答案 Shell配置文件的主要区别在于,有些仅由"登录" shell读取(例如,当您从另一个主机登录时或在本地Unix机器的文本控制台登录时)。这些被称为.login或者.profile或者.zlogin(取决于您使用的外壳)。 然后,您拥有由" Interactive" shell读取的配置文件(如在终端连接的shell(或伪终端),例如,在窗口系统下运行的终端模拟器)。这些是具有名称的终端。喜欢.bashrc,,,,.tcshrc,.zshrc, ETC。 bash使它复杂化.bashrc是only read by a shell that’s both interactive and non-login ,因此您会发现大多数人最终都会告诉他们.bash_profile也要阅读.bashrc有类似的东西 [[ -r ~/.bashrc ]] && . ~/.bashrc 其他贝壳的行为不同 - 例如zsh,,,,.zshrc无论是登录名是否登录,始终为交互式外壳读取。 BASH的手册页说明了每个文件的读取的情况。是的,机器之间的行为通常是一致的。 .profile只是最初使用的登录脚本文件名/bin/sh。bash,通常与/bin/sh,会读.profile如果存在。 来自: stackoverflow.com

' r':找不到命令 - .bashrc / .bash_profile

我有Windows使用Cygwin,试图设置JAVA_HOME永久通过我.bashrc文件。 .bashrc: export PATH="$JAVA_HOME/bin:$PATH" export JAVA_HOME=$JAVA_HOME:"/cygdrive/c/Program Files (x86)/Java/jdk1.7.0_05" .bash_profile: if [ -f ~/.bashrc ]; then source ~/.bashrc fi running cygwin: -bash: $'\377\376if': command not found -bash: $'then\r': command not found : No such file or directorysu//.bashrc -bash: /cygdrive/c/Users/jhsu//.bash_profile: line 3: syntax error near unexpected token `fi' -bash: /cygdrive/c/Users/jhsu//.bash_profile: line 3: `fi' 我不确定我是否从一个用于另一个系统的教程中收取命令,或者是否错过了一步。或Whitespace导致我的命令无法正常运行。 我查看了多个类似的问题,但是我还没有找到一个问题,因为这个问题准确地出现了我的错误。 我的家道: $ echo $HOME /cygdrive/c/Users/jhsu $ echo ~ /cygdrive/c/Users/jhsu/ 因此,我相信这些文件应放置在正确的位置。 答案 When all else fails in Cygwin…...

'$' 是什么意思?

我遇到了一个 shell 脚本,其中包含这样的语句: if [ $val -eq $? ] 什么是$?意思是这里? 答案 $? 返回最后完成的命令的状态。 除此之外$标志是一个特殊的符号 - 在这种情况下$val提取变量保存的值val 来自: stackoverflow.com

“ -ne”在bash中意味着什么?

命令" -ne"在bash脚本中是什么意思? 例如,bash脚本的以下行有什么? [ $RESULT -ne 0 ] 答案 如果您还不知道在哪里看,这是可能很难搜索的事情之一。 [实际上是命令,而不是您可能期望的bash shell语法的一部分。它恰好是bash命令,因此已记录在bash手册中。 还有一个外部命令可以做同样的事情。在许多系统上,它由GNU Coreutils软件包提供。 [等同于test命令,除此之外[需要]作为最后一个论点,以及test才不是。 假设您的系统上安装了BASH文档,则如果您输入info bash并搜索'test'或者'['(撇号是搜索的一部分),您会找到[命令,也称为test命令。如果您使用man bash代替info bash, 搜索^ *test(这个单词test在一条线的开头,跟随一些空间)。 在提到" bash条件表达式"之后,您将导致您的描述-ne,这是数字不平等运算符(" NE"代表"不等)。相比之下,!=是个细绳不平等运营商。 您还可以在网络上找到BASH文档。 bash参考 Bourne shell内置(包括test和[) bash条件表达式 - (滚动到底部;-ne在下面 “精氨酸1 OParg2") POSIX文档test 这官方的 定义test命令是POSIX标准(BASH实现应与某些扩展相同)。 来自: stackoverflow.com

“#!/usr/bin/env bash”和“#!/usr/bin/bash”有什么区别?

在BASH脚本的标题中,这两个陈述之间有什么区别: #!/usr/bin/env bash #!/usr/bin/bash 当我咨询env 男人页,我得到了这个定义: env - run a program in a modified environment 这是什么意思? 答案 通过/usr/bin/env有好处,可以在当前中寻找该程序的默认版本env铁。 这样,您就不必在系统上的特定位置寻找它,因为这些路径可能位于不同系统上的不同位置。只要它在您的道路上,就会找到它。 一个缺点是您将无法通过一个以上的参数(例如,您将无法写作/usr/bin/env awk -f)如果您想支持Linux,POSIX很模糊关于如何解释行,Linux在第一个表示单个参数的空间之后解释了所有内容。您可以使用/usr/bin/env -S在某些版本的env为了解决这个问题,但是随后该脚本将变得更加便携,并破坏相当近期的系统(例如,即使不是以后的Ubuntu 16.04)。 另一个不利的一面是,由于您没有调用明确的可执行文件,因此它具有错误的潜力,并且在Multiuser Systems安全问题上(如果有人设法获取其可执行文件bash例如,在您的道路上)。 #!/usr/bin/env bash #lends you some flexibility on different systems #!/usr/bin/bash #gives you explicit control on a given system of what executable is called 在某些情况下,第一个可能是首选的(例如运行具有多个版本的Python的Python脚本,而无需重新设计可执行的行)。但是,在安全性重点的情况下,后者将是首选,因为它限制了代码注入的可能性。 来自: stackoverflow.com

“导出”命令有什么作用?

为了完成任务,我碰巧盲目地运行了一些命令。 我开始与詹金斯最近,然后我不得不使用这个export命令运行詹金斯战争档案。export命令通常会执行什么操作,为什么我们需要在运行 Jenkins 时运行此命令(在设置 Jenkins 主目录之后)? 答案 export在sh和相关的 shell(例如 Bash),将环境变量标记为出口到子进程,以便子进程继承它们。 export是在 POSIX 中定义的: shell 应将导出属性赋予与指定名称相对应的变量,这将使它们处于随后执行的命令的环境中。 来自: stackoverflow.com

“没有这样的文件或目录”,但它存在

我只想从命令行运行可执行文件,./arm-mingw32ce-g++,但随后我收到了错误消息, bash: ./arm-mingw32ce-g++: No such file or directory 我正在运行Ubuntu Linux 10.10。ls -l列表 -rwxr-xr-x 1 root root 433308 2010-10-16 21:32 arm-mingw32ce-g++ 使用sudo(sudo ./arm-mingw32ce-g++) sudo: unable to execute ./arm-mingw32ce-g++: No such file or directory 我不知道为什么OS在那里时甚至看不到该文件。有什么想法吗? 答案 此错误可能意味着./arm-mingw32ce-g++不存在(但确实如此),或者它存在,并且是一个动态链接的内核识别,但其动态加载程序不可用。您可以通过运行来查看需要什么动态加载器ldd /arm-mingw32ce-g++;任何标记的东西not found是您需要安装的动态加载程序或库。 如果您尝试在 amd64 安装上运行 32 位二进制文​​件: Ubuntu 11.04 之前,安装软件包ia32-libs。 在Ubuntu 11.10上,安装ia32-libs-multiarch。 从12.04开始,安装ia32-libs-multiarch,或选择一组合理的:i386除了包裹:amd64软件包。 来自: stackoverflow.com

[:外壳编程中的意外操作员

我的代码: #!/bin/sh #filename:choose.sh read choose [ "$choose" == "y" -o "$choose" == "Y" ] && echo "Yes" && exit 0 [ "$choose" == "n" -o "$choose" == "N" ] && echo "No" && exit 0 echo "Wrong Input" && exit 0 但是当我执行 sh ./choose.sh 终端提示我 [: 4: n: :Unexpected operator [: 5: n: :Unexpected operator 我的bash脚本有什么错误吗?谢谢! 答案 你没有错bash 脚本。但是您正在执行它sh它的语法不那么广泛;) 所以,运行bash ./choose.sh反而 :) 来自: stackoverflow.com

/dev/null 是什么 2>

我在/etc/cron.daily/apf中找到了这件代码 #!/bin/bash /etc/apf/apf -f >> /dev/null 2>&1 /etc/apf/apf -s >> /dev/null 2>&1 它正在冲洗和重新装饰防火墙。 我不明白>> /dev/null 2>&1部分。 在cron中拥有它的目的是什么?它覆盖了我的防火墙规则。我可以安全地删除这份Cron工作吗? 答案 >> /dev/null重定向标准输出(stdout) 到/dev/null,放弃它。 (这>>似乎是多余的,因为>>意味着附加>意味着截断和写作,然后将其附加到或写入/dev/null具有相同的净效果。我通常只是使用>是因为。) 2>&1重定向标准错误(2)到标准输出(1),然后将其丢弃,因为标准输出已经重定向。 来自: stackoverflow.com

$ {var},“ $ var”和bash shell中的“ $ {var}”之间有什么区别?

标题说的是什么:将变量封装在{},,,,"", 或者"{}"?我还没有在网上找到任何解释 - 除了使用这些符号外,我还没有参考它们。 这是一个例子: declare -a groups groups+=("CN=exampleexample,OU=exampleexample,OU=exampleexample,DC=example,DC=com") groups+=("CN=example example,OU=example example,OU=example example,DC=example,DC=com") 这: for group in "${groups[@]}"; do echo $group done 事实证明与以下方式有所不同: for group in $groups; do echo $group done 和这个: for group in ${groups}; do echo $group done 只有第一个完成我想要的东西:通过数组中的每个元素迭代。我对之间的区别并不清楚$groups,,,,"$groups",${groups}和"${groups}"。如果有人能解释一下,我将不胜感激。 作为一个额外的问题 - 有人知道参考这些封装的公认方法吗? 答案 牙套($varVS.${var}) 在多数情况下,$var和${var}是相同的: var=foo echo $var # foo echo ${var} # foo 只需要解决表达式中的歧义: var=foo echo $varbar # Prints nothing because there is no variable 'varbar' echo ${var}bar # foobar 引号 ($varVS....

$ 是什么?

我正在尝试学习 shell 脚本,并且我需要理解别人的代码。$?变量保持? 答案 $?用于查找最后执行的命令的返回值。 ls somefile echo $? 如果somefile存在(无论是文件还是目录),你会得到抛出的返回值ls命令,应该是0(默认"成功"返回值)。 对于许多程序,您可以在相应的手册页中找到数字及其含义。 来自: stackoverflow.com