标签: bash

如何处理 bash 函数中的命令失败?

我在部署我们代码的其中一台测试服务器上有一个 bash 函数,但其​​中一个命令经常失败,我们找不到原因。我们只是重试,直到它起作用。

如果该命令失败,我想让该函数重试。在函数中,我做了这样的事情:

command_to_run || { echo "failed, retrying"; call_function; }
Run Code Online (Sandbox Code Playgroud)

它像我想要的那样再次调用该函数,但它也允许该函数继续执行。如何在再次调用之前停止当前函数的执行?

bash

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

如何在不知道换行符的情况下跨多行grep长字符串

我想在文件中的多行中搜索特定字符串并获取找到匹配项的行。

但是,我的问题是,该文件包含一个很长的字符串,而不是单词,我想搜索这个长字符串的子序列。因此,我不能使用 pcregrep 而只能搜索 word1\nword2。因为我实际上想获取找到匹配项的行号,所以我不能只删除所有换行符...

这是我的文件的示例,我只是将匹配的字符串大写,以便您可以找到它:

要搜索的字符串:

gcbcdbfceebcfhfchaaccdgfcegffgedffaeaedcbaedhacebeeebcechbcbfeeccbdhcbfg
Run Code Online (Sandbox Code Playgroud)

要搜索的文件:

abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde
abcdeabcde***GCBCDBFCEEBCFHFCHAACCDGFCEGFFGEDFFAEAEDC
BAEDHACEBEEEBCECHBCBFEECCBDHCBFG***ggfbhbgcedabceedfa
fbaaechaabdbffbebecebaacfcfcdcggfchddcefbcbdegbbba
Run Code Online (Sandbox Code Playgroud)

你们中有人有一个简单的解决方案吗?

如果手头没有工具可以做到这一点,我只会编写一个简短的 python 脚本来做到这一点,但我想任何 bash 工具都会比这更有效......

编辑

非常感谢您的回答,如果知道换行符的位置,它们工作得很好。

但是,我很抱歉我的问题不准确。我的问题是,我不知道文件中的字符串中是否有换行符,甚至不止一个换行符,而且,我不知道它在哪里。我通过删除无意中插入的换行符来更正我的搜索字符串。

有没有办法允许在字符串的任何位置换行?

bash grep

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

为什么我的 ssh 会话会立即终止?

我有一台 debian 机器,在那里我很难通过 ssh 登录。通过 ssh 在服务器上执行命令没问题——只是我没有得到提示,但连接再次终止:

> ssh root@192.168.2.109
Linux debian 2.6.32-5-kirkwood #1 Sun May 6 16:57:51 UTC 2012 armv5tel

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Wed Apr 17 21:54:34 2013 from 192.168.2.101
Connection to 192.168.2.109 closed.
Run Code Online (Sandbox Code Playgroud)

正如我所说,运行命令效果很好:

> ssh root@192.168.2.109 cat /etc/bash.bashrc …
Run Code Online (Sandbox Code Playgroud)

linux ssh bash

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

Bash 脚本因“条件表达式中的语法错误”而失败

我是 bash 脚本的新手,我只想做一个简单的小事,但是我在网上阅读的所有内容似乎都不适合我!

所以我在这里有这个脚本:

  #!/bin/bash
  if [[ $1 = "32"]]
  then
      mv config.h config64.h
      mv config32.h config.h
      mv Makefile Makefile64
      mv Makefile32 Makefile
      echo "READY FOR 32 BITS!"
  elif [[ $2 = "64" ]]
  then
      mv config.h config32.h
      mv config64.h config.h
      mv Makefile Makefile32
      mv Makefile64 Makefile
      echo "READY FOR 64 BITS!"
  fi
Run Code Online (Sandbox Code Playgroud)

我得到错误:

./switch-bits.sh: line 3: syntax error in conditional expression
./switch-bits.sh: line 4: syntax error near `then'
./switch-bits.sh: line 4: `then'
Run Code Online (Sandbox Code Playgroud)

所以我的手被扔在了这里……怎么了?

linux script bash

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

ssh 是否具有在已连接时交换文件的功能?

我从来没有听说过这可能,所以答案可能不是。但也许有人知道得更好。

我知道你可以使用sftp之间交换文件的主机遥控器,你既可以:sftp主机远程,从远程主机一旦你已经连接到远程使用SSH

但是现在我的问题是,一旦您连接到远程机器,SSH是否可以使用已建立的连接传输文件?这太合乎逻辑了,我已经连接上了,身份验证完成了,为什么不只使用lls, put. 或者使用一些可以绕过远程 bash 输入行并在主机之间执行某些操作的键组合。

ssh bash

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

bash 命令中文件的短别名

我想要一种访问文件的快捷方式,我通常在 bash 中使用它。例如,查看日志。现在我使用:

less /var/log/user/server.log
less /var/log/user/server2.log
Run Code Online (Sandbox Code Playgroud)

我想要捷径,做

less server.log
less server2.log
Run Code Online (Sandbox Code Playgroud)

我在 .bash_profile 中尝试了这个变体,但在某处有一个错误:

less() { if [[ $@ == "server.log" ]]; then command less /var/log/user/server.log; else command less "$@"; fi; }
Run Code Online (Sandbox Code Playgroud)

unix bash

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

如何将回声结果保存到变量中?

我有一个s3cmd ls --list-md5命令的输出。

    2013-05-22 12:20   1965154   41eae9b40d23de2f02bf07635870f6d0  s3://company-backup/company/amazon/ip-11-11-111-11/backup_server245/app.20121117040001.gz
    2013-05-22 12:20  11456836   541b1bf78682f48867cc99dbb53c4c3a  s3://company-backup/company/amazon/ip-11-11-111-11/backup_server245/app.20121118040001.gz
    ..
Run Code Online (Sandbox Code Playgroud)

我正在尝试验证md5sum来自存储桶中的对象是否与md5sum本地机器中的对象匹配。因此,我需要将hash结果作为fourth列,将文件名作为fifth列。

像那样:

41eae9b40d23de2f02bf07635870f6d0  s3://company-backup/company/amazon/ip-11-11-111-11/backup_server245/app.20121117040001.gz
Run Code Online (Sandbox Code Playgroud)

但我只需要文件名,因此我使用basename命令(我只是不知道如何在这里使用它,但我会弄清楚),最后看起来像这样:

s3=`s3cmd ls --list-md5 s3://company-backup/company/amazon/ip-11-11-111-11/backup_server245/`;
echo "$s3";

echo "$s3" |  tr -s ' ' | cut -d ' ' -f 4;
echo "$s3" |  tr -s ' ' | cut -d ' ' -f 5;
Run Code Online (Sandbox Code Playgroud)

现在我需要将结果存储echo's在相同的变量中,如下所示:

41eae9b40d23de2f02bf07635870f6d0 app.20121117040001.gz
Run Code Online (Sandbox Code Playgroud)

所以我可以将结果s3cmd ls --list-md5sum与我md5sum *.gz在本地运行的结果进行比较。 …

linux bash shell s3cmd

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

SSH 连接到 Ubuntu 机器后,别名停止工作

我正面临 Ubuntu 的问题。ll如果我从 SSH 登录到我的系统,那么Bash 别名就不起作用。bash在 shell 中作为命令写入后它工作正常。

它曾经工作过。可能是什么问题呢?

 echo $SHELL
/bin/bash
Run Code Online (Sandbox Code Playgroud)

ssh bash ubuntu ubuntu-12.04

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

为什么回声 * | rm -f 不起作用?

为什么不起作用echo * | rm -f?根据我的理解,echo *应该列出目录中的所有文件,管道应该将此列表作为参数发送给rm -f命令,该命令应该删除文件。我错过了什么?

linux bash shell

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

在 -bash 中运行 less 命令后,而不是提示,我得到“(END)”。发生了什么,我如何再次获得提示?

我在 .txt 上运行 bash 命令“less”。打印出文件中的行后,将打印文件名和“(END)”。但是我没有再次收到命令提示符。

除了关闭终端窗口并打开一个新窗口之外,我不知道如何进行。

那么,我如何通过这个“(END)”来获得提示?

terminal bash less macos

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

标签 统计

bash ×10

linux ×4

ssh ×3

shell ×2

grep ×1

less ×1

macos ×1

s3cmd ×1

script ×1

terminal ×1

ubuntu ×1

ubuntu-12.04 ×1

unix ×1