Questions tagged «bash»

与其他Bourne / POSIX shell相对,GNU的Bourne Again SHell特有的问题。对于一般关于Unix shell的问题,请改用/ shell标记。


7
SSH会话终止后,为什么我的Python后台进程结束?
我有一个bash脚本,它启动python3脚本(我们称之为startup.sh),其关键是: nohup python3 -u <script> & 当我ssh直接进入并调用此脚本时,退出后,python脚本将继续在后台运行。但是,当我运行此命令时: ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> "./startup.sh" 该过程一旦ssh完成运行就结束,并关闭会话。 两者有什么区别? 编辑:python脚本正在通过Bottle运行Web服务。 EDIT2:我还尝试创建一个初始化脚本,该脚本调用startup.sh并运行ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> "sudo service start <servicename>",但行为相同。 EDIT3:也许是脚本中的其他内容。这是大部分脚本: chmod 700 ${key_loc} echo "INFO: Syncing files." rsync -azP -e "ssh -i ${key_loc} -o StrictHostKeyChecking=no" ${source_client_loc} ${remote_user}@${remote_hostname}:${destination_client_loc} echo "INFO: Running startup script." …

2
从sh文件运行时,Shell脚本会引发未找到的错误。但是,如果手动输入,则命令有效
我正在尝试使用以下脚本为我的网站生成一个站点地图。当我运行它时,sh thsitemap.sh出现这样的错误并创建一个空的sitemap.xml文件: thsitemap.sh: 22: thsitemap.sh: [[: not found thsitemap.sh: 42: thsitemap.sh: [[: not found thsitemap.sh: 50: thsitemap.sh: Syntax error: "(" unexpected 但是作为同一用户,root当我在终端上手动复制并粘贴这些行时,它可以正常工作而没有任何错误,并且sitemap.xml文件具有所有url。有什么问题?我怎样才能解决这个问题? #!/bin/bash ############################################## # modified version of original http://media-glass.es/ghost-sitemaps/ # for ghost.centminmod.com # http://ghost.centminmod.com/ghost-sitemap-generator/ ############################################## url="techhamlet.com" webroot='/home/leafh8kfns/techhamlet.com' path="${webroot}/sitemap.xml" user='leafh8kfns' # web server user group='leafh8kfns' # web server group debug='n' …

6
如何检查文件系统是否已通过脚本安装
我是脚本新手,我可以做一些非常基础的事情,但是现在我需要帮助。 我有一个本地文件系统,仅在需要执行备份时才会挂载。 我从这个开始。 #!/bin/bash export MOUNT=/myfilesystem if grep -qs $MOUNT /proc/mounts; then echo "It's mounted." else echo "It's not mounted."; then mount $MOUNT; fi 如我所说,我在脚本编写方面非常基础。听说您可以mount通过查看返回码来检查命令的状态。 RETURN CODES mount has the following return codes (the bits can be ORed): 0 success 1 incorrect invocation or permissions 2 system error (out of …


3
使用Shell变量获取命令选项
在Bash脚本中,我试图将要使用的选项存储rsync在单独的变量中。这对于简单的选项(例如--recursive)来说效果很好,但是我遇到了--exclude='.*'以下问题: $ find source source source/.bar source/foo $ rsync -rnv --exclude='.*' source/ dest sending incremental file list foo sent 57 bytes received 19 bytes 152.00 bytes/sec total size is 0 speedup is 0.00 (DRY RUN) $ RSYNC_OPTIONS="-rnv --exclude='.*'" $ rsync $RSYNC_OPTIONS source/ dest sending incremental file list .bar foo sent …
19 bash  variable 

3
如何在bash脚本中创建一个新的空文件?
我正在运行一些第三方Perl脚本,编写该脚本时需要输出标记为的输出文件-o。 不幸的是,脚本似乎需要一个实际的文件,也就是说,用户必须创建一个filename.txt0字节的空文件,然后在脚本命令行上输入该空文件。 perl script1.pl -o filename.txt 问题:如何在bash脚本中创建一个空文件?如果只是尝试perl script1.pl -o filename.txt,脚本会给出一个错误,指出该文件不存在。

3
从bash shell脚本循环访问数组索引变量?
我想在bash shell脚本中循环访问数组时访问数组索引变量。 myscript.sh #!/bin/bash AR=('foo' 'bar' 'baz' 'bat') for i in ${AR[*]}; do echo $i done 上面脚本的结果是: foo bar baz bat 我寻求的结果是: 0 1 2 3 如何更改脚本以实现此目的?

4
JSON数组使用jq来bash变量
我有一个像这样的JSON数组: { "SITE_DATA": { "URL": "example.com", "AUTHOR": "John Doe", "CREATED": "10/22/2017" } } 我正在使用jq遍历此数组,因此可以将每个项目的键设置为变量名,并将值设置为其值。 例: URL =“ example.com” AUTHOR =“ John Doe” CREATED =“ 10/22/2017” 到目前为止,我在数组上进行了迭代,但是创建了一个字符串: constants=$(cat ${1} | jq '.SITE_DATA' | jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]") 哪个输出: URL=example.com AUTHOR=John Doe CREATED=10/22/2017 我正在脚本中进一步使用这些变量: echo ${URL} 但这回显了当前的空输出。我猜我eval在那里需要一个或一个东西,但似乎无法将手指放在上面。
19 bash  jq 

2
`disown -h`和`nohup`是否有效地相同?
disown 导致shell在终止时不将SIGHUP发送到其未完成的工作,并且 从Shell的作业控件中删除不相关的作业。 第一个是第二个的结果吗?换句话说,如果以某种方式从外壳启动的进程从外壳的作业控件中删除了,那么在外壳终止时外壳将不会将SIGHUP发送给该进程吗? disown -h 仍然将进程保持在Shell的作业控制之下。这是否意味着disown -h使进程仍然接收从外壳发送的SIGHUP,但是将进程设置为SIGHUP的动作是“忽略”?听起来类似于nohup。 $ sleep 123 & disown -h [1] 26103 $ jobs [1]+ Running sleep 123 & $ fg 1 sleep 123 $ ^Z [1]+ Stopped sleep 125 $ bg 1 [1]+ sleep 123 & $ exit $ ps aux | grep sleep t …
18 bash  nohup  disown 


1
bash根据“ IFS”变量的值更改其行为
当我将IFS变量设置为一个空格时,bash将多个空格视为一个空格(这myprogram是一个打印收到的命令行参数的程序): IFS=" " x="hello hi world" ./myprogram $x argv[1] = hello argv[2] = hi argv[3] = world 但是,当我将IFS变量设置为逗号时,bash不要将多个逗号视为一个逗号: IFS="," x="hello,,,hi,,,world" ./myprogram $x argv[1] = hello argv[2] = argv[3] = argv[4] = hi argv[5] = argv[6] = argv[7] = world 这是为什么?
18 bash  shell 

2
理解`echo $((0x63))`
我在寻找一种通过命令行转换十六进制的方法,发现有一个非常简单的方法echo $((0x63))。 效果很好,但是我对这里发生的事情有些困惑。 我知道$(...)通常是子外壳,其中的内容在外部命令之前进行评估。 在这种情况下它仍然是子外壳吗?我在想不是因为那意味着子shell只是在评估(0x63)这不是命令。 有人可以帮我分解命令吗?
18 bash 

2
为什么此脚本在终端中起作用,但不能在文件中起作用?
我将这个shell脚本保存在一个文件中:它执行一些基本的字符串替换。 #!/bin/sh html_file=$1 echo "html_file = $html_file" substr=.pdf pdf_file="${html_file/.html/.pdf}" echo "pdf_file = $pdf_file" 如果我将其粘贴到命令行中,则可以正常工作: $ html_file="/home/max/for_pauld/test_no_base64.html" echo "html_file = $html_file" substr=.pdf pdf_file="${html_file/.html/.pdf}" echo "pdf_file = $pdf_file" 给 html_file = /home/max/for_pauld/test_no_base64.html pdf_file = /home/max/for_pauld/test_no_base64.pdf 那是上面echo的输出-它按预期工作。 但是,当我调用脚本时, $ saucer "/home/max/for_pauld/test_no_base64.html" 我得到以下输出: html_file = /home/max/for_pauld/test_no_base64.html /home/max/bin/saucer: 5: /home/max/bin/saucer: Bad substitution 我的脚本使用的是bash的其他版本还是其他版本?我需要更改我的shebang行吗?
18 bash  string 

3
为什么带引号的变量中的选项会失败,但不带引号的情况下会起作用?
我了解到我应该在bash中引用变量,例如“ $ foo”而不是$ foo。但是,在编写脚本时,我发现了一种情况,它不带引号但不带引号就可以工作: wget_options='--mirror --no-host-directories' local_root="$1" # ./testdir recieved from command line remote_root="$2" # ftp://XXX recieved from command line relative_path="$3" # /XXX received from command line 这个作品: wget $wget_options --directory_prefix="$local_root" "$remote_root$relative_path" 这个不会(注意$ wget_options周围的双引号): wget "$wget_options" --directory_prefix="$local_root" "$remote_root$relative_path" 这是什么原因呢? 第一行是好的版本;还是我应该怀疑某个地方存在隐藏的错误导致此行为? 通常,在哪里可以找到好的文档来了解bash及其引用的工作原理?在编写此脚本期间,我觉得我开始在反复试验的基础上工作,而不是理解规则。

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.