天道酬勤,学无止境

sh

shell for 循环中的 rsync [重复](rsync in shell for loop [duplicate])

问题 这个问题在这里已经有了答案: 在 bash 脚本中出现“找不到命令”错误(6 个回答) 去年关闭。 我有这个 shell 脚本 #!/bin/sh PATHS=( a b c d ) for PATH in ${PATHS[@]} do rsync -avziP /home/user/$PATH $SERVER:$server_folder -b --backup-dir=$backup_folder/backup_$date --delete --exclude=.* --log-file=$HOME/rsync.log done 我总是收到这个错误: rsync:找不到命令 让我发疯的是,如果我删除 for 循环,然后只运行 rsync 命令,脚本就可以完美运行 回答1 PATH是一个保留变量! 它是指定在哪里搜索工具的变量(如rsync ) $ set | grep ^PATH= PATH=/home/user/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games 使用另一个变量名!

2021-12-09 04:33:55    分类:技术分享    shell   for-loop   sh   rsync

android中的shell脚本给出[:未找到(shell script in android gives [: not found)

问题 我有这个脚本可以在我的 linux 机器上运行 #!/bin/sh c=1 if [ $c == 1 ] then echo c is 1 else echo c is 0 fi 但是当我在 android 中使用它时,如下所示: #!/system/bin/sh c=1 if [ $c == 1 ] then echo c is 1 else echo c is 0 fi 它给出了一个错误,如: [: not found 编辑 是否有任何其他逻辑来检查$c的值,是 1 还是 0 ? Android shell 在 [] 中有问题,如果有的话,还有其他方法可以检查 c 的值吗? 回答1 andriod shell sh 实际上是一个busybox的链接,它被调用为 busybox sh 您需要手动设置 [小程序 busybox ln -s /your_original_sh_path/busybox [ 如果您不知道busybox 放在哪里,请尝试列出您提供的/system/bin/sh ls /system/bin/sh busybox which busybox 回答2 通常[是test的别名, 在 Linux 机器测试中 /usr/bin/test 和 if [ $c == 1 ] 被评估为 if test "$c" = 1 但是在 android 中没有test

2021-12-08 22:40:55    分类:技术分享    android   linux   shell   sh

退出时自动重启 PHP 脚本(Automatically Restart PHP Script on Exit)

问题 有没有一种方法可以在 PHP 脚本退出时自动重新启动它,无论它是正确退出,还是由于错误或内存使用量达到上限等而终止? 回答1 PHP 脚本也可以使用 PCNTL 重新启动。 免责声明:本练习的目的只是为了证明 PHP 完全有能力重新启动并回答问题: 有没有一种方法可以在 PHP 脚本退出时自动重新启动它,而不管它是正确退出还是由于错误而终止? 因此,关于 unix 进程的任何细节都超出了我们的范围,因此我建议您从 PCNTL 书开始或参考 php-pcntl 以获取更多详细信息。 在示例中,我们将假设它是在 *nix 环境中从终端启动的 PHP CLI 脚本,使用以下命令: $ php i-can-restart-myself.php 0 我们传递一个重新启动计数属性作为进程重新启动的指示符。 我可以自动重启 PHP 脚本吗? 我可以! <?php echo ++$argv[1]; // count every restart $_ = $_SERVER['_']; // or full path to php binary echo "\n======== start =========\n"; // do a lot of stuff $cnt = 0; while( $cnt++ < 10000000 ){} echo "\n========== end =======

2021-12-08 19:17:02    分类:技术分享    php   bash   cron   sh   restart

为什么脚本可以使用 /bin/bash 而不是 /bin/sh?(Why will script work with /bin/bash but not /bin/sh?)

问题 我试图理解为什么脚本可以使用#!/bin/bash而不是#!/bin/sh 。 我正在运行 Cygwin 并且sh.exe和bash.exe似乎相同(相同的文件大小)。 $ cat 1.sh #!/bin/sh while read line; do echo ${line:0:9} done < <(help | head -5) $ ./1.sh ./1.sh: line 4: syntax error near unexpected token `<' ./1.sh: line 4: `done < <(help | head -5)' $ cat 2.sh #!/bin/bash while read line; do echo ${line:0:9} done < <(help | head -5) $ ./2.sh GNU bash, These she Type `hel Use `info Use `man 回答1 尽管是同一个文件,但 shell 在运行时会分析自己的名称并切换到普通 shell 或 bash 模式。 回答2 问题 Bash 是 Bourne shell 的超集,因此在 Bash 中可以实现许多在更有限的 shell 中无法实现的功能。 即使sh是bash的硬链接,当作为sh调用时,它的行为也会有所不同。 Bash shell

2021-12-08 17:51:14    分类:技术分享    bash   shell   sh

在 cron 作业中按顺序运行两个命令?(Running two commands sequentially in a cron job?)

问题 我在这样的 cron 作业中有两个命令: mysql -xxxxxx -pyyyyyyyyyyv -hlocalhost -e "call MyFunction1";wget -N http://mywebsite.net/path/AfterMyFunction1.php 但在我看来,他们两个都在同时运行。 如何使第一个命令运行并在它完成后执行第二个命令? AfterMyFunction1.php 也有 javascript http 请求,当我使用 wget 时不会执行这些请求。 如果我在我的网络浏览器中打开 AfterMyFunction1.php,它会起作用。 回答1 如果需要先完成第一个命令,您应该像在 shell 中一样使用 && 运算符将它们分开。 如果第一个失败,第二个将无法运行。 回答2 您可以使用sem ,它是 GNU parallel一部分。 0 0 * * * root sem --jobs 1 --id MyQueue mysql -xxxxxx -pyyyyyyyyyyv -hlocalhost -e "call MyFunction1" 1 0 * * * root sem --jobs 1 --id MyQueue wget -N http://mywebsite.net/path/AfterMyFunction1.php 这个 cron

2021-12-08 16:40:29    分类:技术分享    cron   sh

为什么`if $(true) ; 那么... fi`成功了吗?(Why does `if $(true) ; then ... fi` succeed?)

问题 Inspired by this question: What should an if statement do when the condition is a command substitution where the command produces no output? NOTE: The example is if $(true); then ..., not if true ; then ... For example, given: if $(true) ; then echo yes ; else echo no ; fi I would think that $(true) should be replaced by the output of the true command, which is nothing. It should then be equivalent to either this: if "" ; then echo yes ; else echo no ; fi which prints no because there is no command whose name is the empty string, or to this: if ; then echo yes ; else echo no ; fi which is a

2021-12-08 10:30:36    分类:技术分享    bash   ksh   zsh   sh

shell 脚本(busybox)在 docker 容器上无法按预期工作(shell script (busybox) doesn't work as expected on docker container)

问题 使用 busybox 和 ash 运行基于图像的 alpine: /mnt/builddir/code/src/main/helm # busybox | head -1 BusyBox v1.31.1 () multi-call binary. 我编写了一个 sh 脚本,该脚本仅在文件名以前缀“值”开头时才打印文件名,但带有“if”条件的内容不能正常工作。 这是我的脚本: for f in ./* do echo ${f##*/} if ${f##*/} == 'values'*; then echo $f fi done 输出: /mnt/builddir/code/src/main/helm # ./script.sh Chart.yaml ./script.sh: line 4: Chart.yaml: not found script.sh ./script.sh: line 4: script.sh: not found values-feature.yaml ./script.sh: line 4: values-feature.yaml: not found values-int.yaml ./script.sh: line 4: values-int.yaml: not found values-prod.yaml ./script.sh: line 4

2021-12-07 03:28:35    分类:技术分享    docker   shell   sh   busybox

通过加法和乘法操作文本(text manipulation by addition and multiplication)

问题 我有一个名为“test_file”的文本文件,其中包含 6 行和 7 列,如下所示 0.00 5.8 2.0 5.0 6.0 8.0 0.0 10.00 5.8 2.0 1.0 1.0 1.2 9.6 10.00 9.3 2.2 2.0 1.4 2.5 9.6 30.00 9.3 2.2 1.2 1.5 1.9 1.4 30.00 9.3 2.2 3.2 2.4 1.2 4.1 60.00 9.8 3.5 1.4 2.7 3.2 4.5 我想在第二列和第三列中进行一些文本操作。 在第三列中,前两行值应该相同(2.0 和 2.0),接下来的三行值只是第二行值的 0.2 增量(2.0+0.2=2.2,2.0+0.2=2.2,2.0+0.2=2.2)。但是,我不想更改最后一行,我想保持原样。 之后在第二列中,前两行值应该只是第三列的前两行与 2.9 的乘积。 同样,第二列的下三行只是第三列的下三行与 4.227 的乘积 其他列值我根本不想改变。 现在我想按顺序更改第三列的前两行值,2.1,2.2....2.5,然后是相同的增量和乘法。 例如,当我将第三列的前两行值从原始 2.0 更改为 2.1 时,预期输出应该是 0.00 6.09 2.1 5.0 6.0 8.0 0.0 10.00 6.09 2.1 1.0 1.0 1.2 9.6 10.00 9.722 2.3 2.0 1.4

2021-12-06 15:33:43    分类:技术分享    shell   for-loop   awk   sh

如何启动并运行 sh 格式化程序?(How to get the sh formatter up and running?)

问题 目标是为 bash 脚本( .sh文件)设置格式。 所以我正在尝试使用 .sh 格式化程序。 来自项目的github快速入门部分; 我已经安装并像这样拉入shfmt 模块: GO111MODULE=on go get mvdan.cc/sh/v3/cmd/shfmt 。 但是在尝试调用shfmt 命令时。 我收到 common command not found 错误。 我如何实际使用shfmt 命令。 我的假设是,这是即插即用的,即我并不需要真正去摆弄路径或ENVS。 回答1 该命令安装为$HOME/go/bin/shfmt (除非设置了 GOBIN,否则它是$GOBIN/shfmt ): $ go help install usage: go install [-i] [build flags] [packages] Install compiles and installs the packages named by the import paths. Executables are installed in the directory named by the GOBIN environment variable, which defaults to $GOPATH/bin or $HOME/go/bin if the GOPATH environment

2021-12-05 09:43:53    分类:技术分享    bash   go   sh

我什么时候应该双引号参数扩展? [复制](When should I double-quote a parameter expansion? [duplicate])

问题 这个问题在这里已经有了答案: 什么时候应该用引号将 shell 变量括起来? (5 个回答) 2年前关闭。 假设我有一个变量x 。 扩展它时,我应该使用$x还是"$x" ? (这旨在作为任何围绕未引用参数扩展的问题的规范副本。) 回答1 始终使用"$x" ,至少一开始是这样。 正确的案例远远多于错误的案例。 参数扩展受分词和路径名扩展的影响,您通常不想要这两种扩展。 引用扩展保留参数的文字内容。 相比 $ x="foo * bar" $ printf '%s\n' "$x" foo * bar 到 $ printf '%s\n' $x foo <every file in the current directory> bar 如果您的逻辑确实需要进行分词或路径名扩展,则很有可能需要更改您的脚本设计以避免该要求。 始终引用参数扩展至少会减少您需要修复的错误数量。 作为推论,永远没有理由不${foo[@]}引号地使用${foo[@]} 。 @ indexing 的存在就是在引用时具有特殊的行为(与* indexing 相比)。 不加引号时,两者是相同的,因此您也可以使用${foo[*]} 。 相同的参数适用于特殊参数$@和$* 。 $ x=("foo bar" baz) $ printf '%s\n' "${x[@]}" # expands to two elements

2021-12-05 01:06:19    分类:技术分享    bash   sh