相关疑难解决方法(0)

如何检查gcc是否失败,返回警告或成功进行Bash?

我如何检查gcc是否已成功编译程序,失败或成功但是有警告?

#!/bin/sh

string=$(gcc helloworld.c -o helloworld)

if [ string -n ]; then
    echo "Failure"
else
    echo "Success!"
fi
Run Code Online (Sandbox Code Playgroud)

这只检查它是否成功或(失败或编译时带有警告).

-n表示"不为空".

谢谢!

编辑如果不清楚,这是行不通的.

bash gcc

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

如何配置对话框bash的取消按钮?

例如,我想配置此对话框的“取消”按钮。

dialog --backtitle "Dialog - Form sample" \
 --form " Form Test - use [up] [down] to select input field " 21 70 18 \
 "Network-ID:" 2 2 "" 2 15 20 0\
 "Subnet Mask:" 4 2 "" 4 15 20 0\
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点 ?

bash shell

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

如何在外壳中获取测试命令返回码?

是否有更好的方法从一行中获取命令的返回代码。例如:

$ test $(ls -l) ||echo 'ok'
-bash: test: too many arguments
ok
Run Code Online (Sandbox Code Playgroud)

上面的脚本在test命令中有错误,因为它似乎解析输出“ ls-l”而不返回代码。

我知道使用“如果”语法可以正常工作,但是需要多一行。

ls -l
if [ $? -eq 0 ];then
   echo 'ok'
fi
Run Code Online (Sandbox Code Playgroud)

shell exit-code

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

在 shell 脚本中终止并重新启动 ngrok

我需要ngrok每 24 小时终止并重新启动我的服务器,所以我考虑使用 cronjob 来运行 shell 脚本。我面临的问题是,当我ngrok在 shell 脚本中重新启动时,它会在给定的 shell 会话中启动它。

我如何才能ngrok在不同的会话中启动,以便我可以继续在同一脚本中进行其他检查?

到目前为止我的代码:

# grabs the PID for the current running ngrok
ngrok_pid=$(pgrep ngrok)
echo "Current ngrok PID = ${ngrok_pid}"

# kills ngrok
kill_ngrok_pid=$(kill -9 $ngrok_pid)

# get exit status code for last command
check=$?

# check if the exit status returned success
if [ $check -eq 0 ]; then
    # re-start ngrok
    $(./ngrok http 5000 &)
    # do more checks below...
else
    echo …
Run Code Online (Sandbox Code Playgroud)

shell sh ngrok

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

同步shell脚本执行

shell脚本的修改版本将音频文件从FLAC转换为MP3格式.该计算机具有四核CPU.该脚本使用以下命令运行:

./flac2mp3.sh $(find flac -type f)
Run Code Online (Sandbox Code Playgroud)

这会将flac目录中的FLAC文件(文件名中没有空格)转换为mp3目录中的MP3文件(与文件名相同flac).如果目标MP3文件已存在,则脚本将跳过该文件.

问题是,有时两个脚本实例几乎同时检查是否存在相同的MP3文件,导致MP3文件损坏.

如何多次运行脚本(即每个核心一次),而不必在每个命令行上指定不同的文件集,而不覆盖工作?

更新 - 最小竞争条件

该脚本使用以下锁定机制:

  # Convert FLAC to MP3 using tags from flac file.
  #
  if [ ! -e $FLAC.lock ]; then
    touch $FLAC.lock
    flac -dc "$FLAC" | lame${lame_opts} \
      --tt "$TITLE" \
      --tn "$TRACKNUMBER" \
      --tg "$GENRE" \
      --ty "$DATE" \
      --ta "$ARTIST" \
      --tl "$ALBUM" \
      --add-id3v2 \
      - "$MP3"
    rm $FLAC.lock
  fi;
Run Code Online (Sandbox Code Playgroud)

然而,这仍然留下了竞争条件.

linux bash shell multiprocessing race-condition

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

在bash`if [..]`语句中检查命令是否成功

我正在尝试自动化我们的应用程序备份.过程的一部分是检查的退出状态egrep中的if语句:

if [ ! -f /opt/apps/SiteScope_backup/sitescope_configuration.zip ] ||
   [ egrep -i -q "error|warning|fatal|missing|critical" "$File" ]
then 
  echo "testing"
fi
Run Code Online (Sandbox Code Playgroud)

我希望它输出,testing因为文件存在并egrep返回成功,但我得到一个错误:

-bash: [: too many arguments
Run Code Online (Sandbox Code Playgroud)

我尝试了各种语法 - 附加括号,引号等但错误仍然存​​在.

请帮助我理解我哪里出错了.

bash if-statement

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

Bash 脚本使用 return 语句和变量 $? 检查第一个参数是否存在

bash 脚本中的新增功能,必须编写一个函数来检查第一个给定参数是否为空。如果为空则输出错误信息,否则成功。\n使用return语句和变量$? 例如,输出应如下所示:\n ./test.sh-> Script failed; ./test.sh hallo-> Script OK。\n谢谢!

\n\n

这就是我现在所拥有的:

\n\n
check_parameter() {\n  var=$1\n\n  if [ -z ${var} ]; then\n    return 1\n  else\n    return 0\n  fi\n\n  if [ $?== 0 ]; then\n    echo " OK. "\n\n  else\n    echo " failed. "\n  fi\n}\ncheck_parameter $1\n
Run Code Online (Sandbox Code Playgroud)\n\n

似乎\xc3\xacf [ -z $var ]or\xc3\xacf [ -z ${var} ]不起作用。

\n

linux bash

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

如何在Unix中将一个shell脚本的输出捕获到另一个

我正在运行一个shell脚本run_sftp.sh, 其输出将为“完成”或“失败”,并且我将此脚本调用为另一个脚本,如果run_sftp.sh输出为“完成”,该脚本将执行一些命令。

If [ Output(run_sftp.sh) = 'done' ] then
  echo "run"
else
  "Stop running"
fi 
Run Code Online (Sandbox Code Playgroud)

这是算法。请提出建议。

unix shell awk sed

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

在 bash 中使用“exit ${?}”是否正确?

假设我编码如下:

if [ ${?} -ne 0 ]; then 
    exit ${?}
Run Code Online (Sandbox Code Playgroud)

这会正常工作吗?这是正确的“语法明智”吗?

syntax bash exit

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

通过在脚本中修改/ etc / ssh / sshd_conf来禁用ssh根登录?

又是我。

非常感谢,您所有的绝妙技巧都非常有用!也许您可能想把我的屁股踢过去。

在设置Raspberry的过程中,我想防止通过ssh进行root登录。与往常一样,它是一个“小脚本”(由跑步者调用)。

我的研究告诉我,即使在systemd时代,/ etc / ssh / sshd_config也是要修改的文件。到目前为止,一切都很好。以我的拙劣理解,需要做的是:逐行读取配置文件,匹配“ PermitRootLogin yes”(空格匹配);如果不匹配,则将该行写入另一个文件,如果是,则将其替换为“ PermitRootLogin no”,然后写入另一个文件,最后用新文件替换原始配置文件,然后通过systemd东西重新启动sshd。

在Perl中,我将读取整个文件,替换()行,然后将内容写回到另一个文件中。但是正如年轻的佛教徒所说:“没有Perl!”

请仅Bash(2)。

并且,一如既往,在此先感谢您!

卡斯滕

ssh bash shell

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

标签 统计

bash ×7

shell ×6

linux ×2

awk ×1

exit ×1

exit-code ×1

gcc ×1

if-statement ×1

multiprocessing ×1

ngrok ×1

race-condition ×1

sed ×1

sh ×1

ssh ×1

syntax ×1

unix ×1