设置在执行命令之前打印每个命令的bash脚本的最佳方法是什么?
这对于调试来说非常有用.
我已经尝试过了:
CMD="./my-command --params >stdout.txt 2>stderr.txt"
echo $CMD
`$CMD`
Run Code Online (Sandbox Code Playgroud)
它应该做的是先打印出来:
./my-command --params >stdout.txt 2>stderr.txt
Run Code Online (Sandbox Code Playgroud)
然后执行./my-command --params,输出重定向到指定的文件.
有没有人知道我们是否可以set +x在没有打印的情况下用bash 说:
set -x
command
set +x
Run Code Online (Sandbox Code Playgroud)
痕迹
+ command
+ set +x
Run Code Online (Sandbox Code Playgroud)
但它应该打印
+ command
Run Code Online (Sandbox Code Playgroud)
Bash是版本4.1.10(4).这对我来说已经有一段时间了 - 输出混乱了无用的set +x线路,使得跟踪设施没有那么有用.
我里面有很多的命令,并会产生大量输出的测试脚本,我使用set -x或set -v和set -e,所以当发生错误的脚本将停止.但是,我仍然很难找到执行停止的哪一行以找到问题.是否有一种方法可以在执行每一行之前输出脚本的行号?或者在命令展览生成之前输出行号set -x?或任何可以处理我的脚本行位置问题的方法将是一个很大的帮助.谢谢.
这必须是非常简单或非常复杂,但我找不到任何关于它...我试图打开一个新的bash实例,然后在其中运行一些命令,并将控件返回给用户内部相同的实例.
我试过了:
$ bash -lic "some_command"
Run Code Online (Sandbox Code Playgroud)
但这会some_command在新实例中执行,然后关闭它.我希望它保持开放.
还有一个可能会影响答案的细节:如果我可以让它工作,我会在我的.bashrc别名中使用它,所以实现的奖励积分alias!
在shell脚本中,我想回应一些主要(长时间运行)命令的状态和调试原因.我知道我可以使用set -x或启用所有命令的回显set -v.但我不想看到所有命令(特别是不是echo命令).有没有办法只为一个命令打开回声?
我可以这样做,但那很难看,并且也回应了这一行set +x:
#!/bin/sh
dir=/tmp
echo List $dir
set -x
ls $dir
set +x
echo Done!
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?
我正在编写一个Bash脚本,我希望所有命令在发生时都能回显.我知道我需要分别使用set -x和set +x切换此行为(此处的SOF帖子).但是,它不会回显所有内容,即I/O重定向.
例如,假设我有这个非常简单的Bash脚本:
set -x
./command1 > output1
./command2 arg1 arg2 > output2
Run Code Online (Sandbox Code Playgroud)
这将是输出
+ ./command1
+ ./command2 arg1 arg2
Run Code Online (Sandbox Code Playgroud)
Bash没有回显我的stdout重定向到output1和output2.为什么是这样?我怎样才能实现这种行为?也许shopt我必须在脚本中设置一个选项?
注意:我还注意到管道不会按预期打印.例如,如果我要使用此命令:
set -x
./command3 | tee output3
Run Code Online (Sandbox Code Playgroud)
我会得到这个输出:
+ tee output3
+ ./command3
Run Code Online (Sandbox Code Playgroud)
如何使命令完全按照它们的编写方式进行回显,而不是让脚本重新排序管道?
给定命令行构建步骤,使用以下自定义脚本:
msdeploy -verb:sync -source:package='%teamcity.build.projectid%\%WebProjectName%.csproj.zip'
Run Code Online (Sandbox Code Playgroud)
我怎么能看到变量最终被替换了?
我没有看到任何"详细日志记录"选项,它保存用于在任何地方调试构建服务器的最终输出
我有一个 bash 脚本,它执行大约 20 个命令,出于调试目的,我发现自己经常滚动输出。\n不幸的是 bash 没有告诉我输出的哪一部分是哪个命令的一部分。\n当我在脚本中使用“set -x”时,它至少会打印一些有关其刚刚执行的信息,但我不太喜欢它生成的输出。
\n\n例如,如果我有这个脚本:
\n\n#!/bin/bash\n\nset -x\necho "foo"\nif [ "$ASD" == "QWE" ] ; then\n echo "bar"\nfi\nRun Code Online (Sandbox Code Playgroud)\n\n我希望输出是这样的:
\n\n\n\n\n回显“foo”
\n
\n foo
\n 回显“bar”
\n bar
或者可能:
\n\n\n\n\necho "foo"
\n
\n foo
\n if [ "value_of_ASD" == "QWE" ] ; 然后
\n echo "bar"
\n bar
\n fi
除了用粗体打印命令之外,用颜色突出显示也可以。但我不只是想在命令前面有“+”字符,而且我也不喜欢 if 语句像 那样显示\'[\' value_of_ASD == QWE \']\'。
我怎样才能用 bash 来实现这一点?
\n\n目前输出看起来像这样:
\n\n+ echo …Run Code Online (Sandbox Code Playgroud) 如何在鱼壳中打印执行的命令?
我已经尝试过在shell脚本中提供解决方案:在执行命令时回显shell命令,但是它们与fish shell不兼容。
有没有一种方法可以让脚本同时记录命令行运行(包括管道运行)及其输出,而无需复制命令行?
目的是脚本应该有一个干净的输出,但应该详细地记录到日志文件中(所以没有set -x)。除了输出之外,它还应记录导致输出的命令行,这可能是管道命令一衬里。
最基本的方法是复制脚本中的命令行,然后将其转储到日志中,然后捕获正在运行的实际命令的输出:
echo "command argument1 \"quoted argument2\" | grep -oE \"some output\"" >> file.log
output="$(command argument1 "quoted argument2" 2>&1 | grep -oE "some output")"
echo "${output}" >> file.log
Run Code Online (Sandbox Code Playgroud)
这有一个副作用,即日志中引用的部分需要转义,这可能会导致错误,从而导致混乱。
如果没有任何命令通过管道传输,则可以将命令行存储在数组中,然后“运行”该数组。
command=(command argument1 "quoted argument2")
echo "${command[@]}" >> file.log
output="$("${command[@]}" 2>&1)"
echo "${output}" >> file.log
Run Code Online (Sandbox Code Playgroud)
虽然用这种方法"quoted argument2"会变成quoted argument2日志。
有没有一种方法(在 bash 中)可以实现这一点而不必重复命令?
从如何在执行 shell 命令时回显它们,我已经学会了如何set -v在执行命令时使用打印命令。如果set -v在开始时添加foo.sh或bash -v foo.sh运行,则效果很好。但是,如果通过或 简单地foo.sh调用,则不会打印中的命令。是否有一个全局开关可以使所有命令和函数通过所有调用的脚本在执行时打印出来?bar.shbash bar.sh./bar.shbar.sh