相关疑难解决方法(0)

Bash语法错误:"[[:not found"

我正在使用当前正在服务器上运行的bash脚本(RHEL4).我正在使用Ubuntu 10.04在我的笔记本电脑上进行开发,但我不认为该平台会导致问题.

这是正在发生的事情:我有一个骨架脚本,调用另一个执行大部分工作的脚本.但是,它会调用getConfig.sh.getConfig.sh基本上只是解析一些命令行参数(使用getopts)并调用Java程序来解析一些XML文件.无论如何,getConfig.sh会抛出很多错误(但似乎仍然有效).

这是我得到的信息

getconfig.sh:89:[[:找不到
getconfig.sh:89:[[:找不到
getconfig.sh:94:[[:未找到]

每次运行时我都会收到这三个错误; 但是,脚本完成并运行Java代码.

这是相关代码部分

parseOptions $*

if [[ "${debugMode}" == "true" ]] ; then
    DEBUG="-DDEBUG=true"
    echo "${JAVA_HOME}/bin/java ${DEBUG} -Djava.endorsed.dirs=${JAXP_HOME} -jar $(dirname $0)/GetXPath.jar ${XML_File} ${XPath_Query}"
fi

第89行是"parseOptions $*而第94行是"fi"

谢谢你的回答.

bash

5
推荐指数
2
解决办法
1万
查看次数

不支持流程替换<(...)?

在Centos 6机器上,这适用于:

bash -c 'if grep -qP --line-buffered ".+" <(tail -n 1000 -F catalina.out) ; then echo "yes"; fi'
Run Code Online (Sandbox Code Playgroud)

这不是:

sh -c 'if grep -qP --line-buffered ".+" <(tail -n 1000 -F catalina.out) ; then echo "yes"; fi'
Run Code Online (Sandbox Code Playgroud)

我明白了:

sh: -c: line 0: syntax error near unexpected token `('
sh: -c: line 0: `if grep -qP --line-buffered ".+" <(tail -n 1000 -F catalina.out) ; then echo "yes"; fi'
Run Code Online (Sandbox Code Playgroud)

没关系grep和tail.问题在于过程替换问题:<(...)

有人可以告诉我这里有什么不同吗?

[编辑]

谢谢你的回答!

使用capistrano进行部署时出现了问题.它默认使用sh,但我现在将其更改为bash.我不能做正常管道的原因是在使用时tail …

linux bash sh

5
推荐指数
2
解决办法
3190
查看次数

如何通过Cron运行bash脚本

我已经看到了其他类似的问题,但我找不到任何关于如何找出通过Crontab运行Bash脚本的正确方法的真实信息.该.sh文件位于用户目录中(在我的例子中serverpilot).

该脚本正在尝试复制apps文件夹的内容并发送到我的S3存储桶.当sh backupS3.sh从终端运行时脚本运行得很好,但是没有通过Cron的欢乐.我见过人们参考PATH变量等但不知道从哪里开始!

/backupS3.sh

#!/bin/sh
echo 'Started backing to S3'
date +'%a %b %e %H:%M:%S %Z %Y'
aws s3 sync /apps s3://bucketname
date +'%a %b %e %H:%M:%S %Z %Y'
echo 'Finished backing to S3'
Run Code Online (Sandbox Code Playgroud)

crontab中

*/10 * * * * /backupS3.sh >> backupS3.log  
Run Code Online (Sandbox Code Playgroud)

任何人都可以指出我做错了什么吗?谢谢!

编辑:我已经在cron命令的末尾添加了2>&1,现在我在日志文件中得到了一些内容:

/bin/sh: 1: /backupS3.sh: not found

bash cron

5
推荐指数
3
解决办法
3万
查看次数

语法错误:循环变量不正确

我正在尝试编写一个将在后台播放广播的脚本

#!/bin/sh

for (( i = 80 ; i <= 101; i++ )) 
 do 
  amixer cset numid=1 i$% sleep 60;
done 
Run Code Online (Sandbox Code Playgroud)

但我有问题:

alarmclock-vol.sh: 3: alarmclock-vol.sh: Syntax error: Bad for loop variable
Run Code Online (Sandbox Code Playgroud)

bash sh

4
推荐指数
1
解决办法
2万
查看次数

./和〜/之间的区别

在创建文件路径和URL时,我注意到路径以./or 开头很多次~/.

./和开头的文件路径有什么区别~/

他们每个人的意思是什么?

filepath tilde

4
推荐指数
3
解决办法
6386
查看次数

转义`docker exec`中的$()语法

我正在尝试运行一个命令,该命令有一个$()参数(不确定那个叫什么)应该在Docker容器中进行评估.例如:

docker exec mycontainer echo $(whoami)
Run Code Online (Sandbox Code Playgroud)

执行此操作时,whoami首先在主机上运行,​​然后插入主机的用户.相反,我希望whoami在容器中评估该命令,以便容器的用户被回显.

我发现很难找到任何帮助.我试过的替代方案不起作用:

docker exec mycontainer 'echo $(whoami)'
docker exec mycontainer echo '$(whoami)'
docker exec mycontainer echo $$(whoami)
docker exec mycontainer echo \$(whoami)
Run Code Online (Sandbox Code Playgroud)

怎么能实现这一目标?

bash command-substitution docker

4
推荐指数
1
解决办法
2115
查看次数

如何在使用 dockerfile 运行容器时运行 .sh 文件

我正在制作一个 dockerfile 来安装 elasticsearch:6.5.4 并向所需位置添加几个文件,并运行名为 test.sh 的脚本以在运行 elasticsearch 时在 elasticsearch 中创建一个新索引。

我不确定我是否应该使用 RUN、CMD 或 ENTRYPOINT 来做到这一点。

我通过注释我的最后一行(包含 RUN/CMD/ENTRYPOINT test.sh)成功构建了一个映像并运行了一个容器。我能够从容器的 bash 运行 test.sh 并获得所需的结果。

但是当我尝试为相同的过程构建图像时,出现以下错误:

$ docker build -t es .
Sending build context to Docker daemon  7.499MB
Step 1/8 : FROM elasticsearch:6.5.4
 ---> 93109ce1d590
Step 2/8 : WORKDIR /app
 ---> Running in 6b6412093d53
Removing intermediate container 6b6412093d53
 ---> a374ab69eb1a
Step 3/8 : ADD . /app
 ---> 6ed98ee7ad49
Step 4/8 : COPY test.sh .
 ---> 42184ec64c09
Step 5/8 : ADD analysis …
Run Code Online (Sandbox Code Playgroud)

bash elasticsearch docker dockerfile

4
推荐指数
1
解决办法
1万
查看次数

MacOS 更喜欢 /bin/sh 还是 /bin/bash?

我想与某人共享一个脚本,但不确定 MacOS 上首选哪个。哪一个最好支持?

这?

#!/bin/sh
echo "Here goes my simple script that changes some settings."
# ... do some stuff
Run Code Online (Sandbox Code Playgroud)

或这个?

#!/bin/bash
echo "Here goes my simple script that changes some settings."
# ... do some stuff
Run Code Online (Sandbox Code Playgroud)

macos bash shell terminal

4
推荐指数
1
解决办法
1万
查看次数

忽略 Bash 脚本中 Source 命令的失败

所以我知道有很多关于堆栈溢出的答案可以忽略 bash 脚本中的错误。不过,它们似乎都不适用于 source 命令。

我已经尝试过久经考验的 source ../bin/activate || true

set -e在运行命令之前尝试过设置

我试过了 source ../bin/activate 2>&1 /dev/null

set +e在运行命令之前尝试过设置。这也不起作用。

但是在这段代码的每次运行中,我都会收到

run.01: line 12: ../bin/activate: 没有那个文件或目录

这个问题的上下文是我正在创建一个运行一些 python 代码的简单 bash 脚本。指示用户如何创建特定的虚拟环境,如果他们正确设置,此行将自动激活它,否则,这应该忽略无法激活运行并在当前激活的任何环境中继续运行命令。

# Try virtual environment

source ../bin/activate || true

## Run.

code="../src-01/driver.v01.py"

## --------------------
graphInputFile="undirected_graph_01.inp"
graphType="undirected"
srcColId="0"
desColId="1"
degreeFind="2"
outFile="count.undirected.num.nodes.out"

python $code  -inpGraphFile $graphInputFile  -graphFormat $graphType  -colSrcId $srcColId -colDesId $desColId  -degreeFind $degreeFind  -output_file $outFile
Run Code Online (Sandbox Code Playgroud)

无论命令是否source ../bin/activate成功,python 命令都应该执行。我有点不明白为什么这些解决方案都不起作用,目前我假设在这种情况下source可能会做一些与正常命令不同的事情。

编辑:

#!/bin/bash -x按照要求将shebang添加到我的文件中,但这没有做任何事情。

这是我运行此脚本时的确切终端输出。 …

python macos bash shell terminal

4
推荐指数
2
解决办法
1651
查看次数

bash 脚本中出现意外的语法错误 `("

我正在编写一个简单的 bash 脚本,我在第 XX 行“(”处发现了这个错误语法错误,这超出了我的代码:

function myfun(){
   echo XXXX
   echo YYYY
   read choice
}

choice=$(myfun)
Run Code Online (Sandbox Code Playgroud)

错误在哪里。我使用了 ShellCheck,没有检测到错误。

linux bash scripting

4
推荐指数
1
解决办法
1万
查看次数