相关疑难解决方法(0)

如何在bash脚本中使用文件描述符3中的"read"读取?

http://bash.cyberciti.biz/file-management/shell-script-to-simulate-unix-more-command/

#!/bin/bash
# Write a shell script like a more command. It asks the user name, the
# name of the file on command prompt and displays only the 15 lines of
# the file at a time.
# -------------------------------------------------------------------------
# Copyright (c) 2007 nixCraft project <http://cyberciti.biz/fb/>
# This script is licensed under GNU GPL version 2.0 or above
# -------------------------------------------------------------------------
# This script is part of nixCraft shell script collection (NSSC)
# Visit http://bash.cyberciti.biz/ for more information.
# ------------------------------------------------------------------------- …
Run Code Online (Sandbox Code Playgroud)

linux bash shell

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

未找到Bash中的数组

我试图在bash中声明一个数组,但是当代码运行时它说它找不到数组.我试图用几种不同的方式写出数组的声明,但似乎无论我如何声明它我都无法让它工作.我原本试图这样声明:

candidate[1]= 0
candidate[2]= 0
candidate[3]= 0
Run Code Online (Sandbox Code Playgroud)

返回的错误消息是:

votecalculation.sh: 13: candidate[1]=: not found
votecalculation.sh: 14: candidate[2]=: not found
votecalculation.sh: 15: candidate[3]=: not found
Run Code Online (Sandbox Code Playgroud)

在此之后我尝试了另一种在线发现的解决方案

ARRAY=( 'can1' 'can2' 'can3' )
Run Code Online (Sandbox Code Playgroud)

使用它时会返回此错误:

votecalculation.sh: 12: Syntax error: "(" unexpected
Run Code Online (Sandbox Code Playgroud)

我是Bash的新手,我对阵列感到很困惑.我需要一些特定的方式来声明一个数组,还是我只是完全错了?

linux bash

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

".filename"从/ bin/sh运行时找不到文件,从/ bin/bash开始工作; 为什么?

我的简单脚本是这样的:

#!/bin/sh


DEF=.file_name_with_a_leading_dot.sh

. ${DEF}
Run Code Online (Sandbox Code Playgroud)

注意顶行的/ bin/sh.当我运行这个简单的脚本时,我收到一个错误,找不到该文件.但是,如果我将该顶行更改为#!/ bin/bash,则脚本会在当前目录中找到该文件.

但是,在我的Ubuntu linux笔记本电脑上,我看到/ bin/sh是/ bin/bash的符号链接.那么,为什么我的脚本表现不同?

另外,我可以像这样运行脚本:

/bin/bash ./script.sh
Run Code Online (Sandbox Code Playgroud)

没关系.

那么,我错过了什么?

linux bash shell sh

7
推荐指数
1
解决办法
2803
查看次数

语法错误:“(”意外(期望“然后”)

我在使用 bash 脚本时遇到了麻烦。我正在尝试通过 ssh 自动化将文件发送到我的树莓派的过程。我想提示输入文件/目录的路径,然后将其复制到/home/pi/push我的 pi 上的目录中。然后我想问一下是否还有另一个文件要发送,如果是,则再次循环,否则退出程序。出于明显的安全原因,我将 IP 地址归零。

done=0
while [ $done -lt 1 ]
do
    read -r -p "Path to file: " path
    spawn scp -r $path pi@000.00.000.00:/home/pi/push
    expect "assword:"
    send "password\r"
    interact

    read -r -p "Send another? [y/N] " response
    if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]
    then
        $done=1
    else
        echo "Ending file transfer."
    fi
done
Run Code Online (Sandbox Code Playgroud)

如果您对实现这一目标的更好方法有任何建议,那也太棒了!

ssh bash if-statement syntax-error while-loop

7
推荐指数
1
解决办法
6420
查看次数

如何从 npm 脚本通过管道传输到 bash 别名?

我的 .bashrc 中有一个 Bunyan 的别名:

$ alias bsh
alias bsh='bunyan -o short'
Run Code Online (Sandbox Code Playgroud)

此行在 bash 中运行良好:

$ coffee src/index.coffee | bsh
Run Code Online (Sandbox Code Playgroud)

但如果我把同样的东西放在“脚本”中

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "coffee":"coffee src/index.coffee | bsh"
  },
Run Code Online (Sandbox Code Playgroud)

并且npm run coffee,它失败了:

> coffee src/index.coffee | bsh

sh: bsh: command not found
events.js:141
      throw er; // Unhandled 'error' event
      ^

Error: write EPIPE
  at exports._errnoException (util.js:870:11)
  at WriteWrap.afterWrite (net.js:769:14)
Run Code Online (Sandbox Code Playgroud)

所以我随机尝试放入而||不是并且|它起作用了。但我不明白为什么。据我所知,我不必转义 JSON 中的管道字符。

然而,它实际上并不将输出通过管道传输到 bsh 别名。

实际的修复方法是使用 …

bash json node.js

7
推荐指数
1
解决办法
2430
查看次数

如何查看 /bin/sh 指向的内容

我正在阅读 /bin/sh 和 /bin/bash 之间的差异,并遇到了这个有趣的问题/答案:here

我对在我的标题中提出同样问题的答案发表了评论,他回复了更新的答案:

如何找出系统上 /bin/sh 指向的内容?

复杂的是 /bin/sh 可能是符号链接或硬链接。如果它是符号链接,则解决它的可移植方法是:

> % file -h /bin/sh
> /bin/sh: symbolic link to bash 
Run Code Online (Sandbox Code Playgroud)

如果是硬链接,请尝试

> % find -L /bin -samefile /bin/sh 
> /bin/sh 
> /bin/bash
Run Code Online (Sandbox Code Playgroud)

我尝试了这个,但遇到了麻烦,所以我想我应该提出一个单独的问题。

我从链接答案得到的结果:

>file -h /bin/sh
>/bin/sh: executable (RISC System/6000) or object module

>find -L /bin -samefile /bin/sh
>find: bad option -samefile
Run Code Online (Sandbox Code Playgroud)

我缺少什么?我正在运行 AIX:

>oslevel -s
7100-03-03-1415
Run Code Online (Sandbox Code Playgroud)

unix bash shell aix

6
推荐指数
1
解决办法
6287
查看次数

如何在 IPython 魔术命令后添加评论

如何在IPython 魔术命令的末尾添加注释?

例如,尝试使用%cd

%cd "dir"  # comment
Run Code Online (Sandbox Code Playgroud)

我想更改为目录,dir但我得到:

[Errno 2] No such file or directory: 'dir # comment'
Run Code Online (Sandbox Code Playgroud)

ipython ipython-magic jupyter-notebook

6
推荐指数
1
解决办法
220
查看次数

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

在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万
查看次数

Jenkins 可以获取关联用户的 .bashrc 吗?

我的Jenkins运行Tomcat在 user 下运行buildman,因此所有作业都在该用户(in CentOS)下运行。我的一些工作取决于我在.bashrc. 但是,Jenkins 作业看不到该文件中设置的任何变量,即使该脚本应该是为非登录 shell 提供的,例如我认为 Jenkins 应该是(?)。

解决方法很简单:我只是将 .bashrc 中的所有变量复制并粘贴到 Jenkins 的构建命令脚本中。但这不是很优雅。有什么方法可以让 Jenkins 获取它运行的用户的 .bashrc ,以便它获得其通常的配置,而不必在每个作业中单独设置它?

bash environment-variables .bash-profile jenkins

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