相关疑难解决方法(0)

执行前打印每个命令?

设置在执行命令之前打印每个命令的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,输出重定向到指定的文件.

bash

216
推荐指数
4
解决办法
12万
查看次数

Bash设置+ x而不打印

有没有人知道我们是否可以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线路,使得跟踪设施没有那么有用.

bash shell

78
推荐指数
4
解决办法
2万
查看次数

如何在执行bash脚本时显示行号

我里面有很多的命令,并会产生大量输出的测试脚本,我使用set -xset -vset -e,所以当发生错误的脚本将停止.但是,我仍然很难找到执行停止的哪一行以找到问题.是否有一种方法可以在执行每一行之前输出脚本的行号?或者在命令展览生成之前输出行号set -x?或任何可以处理我的脚本行位置问题的方法将是一个很大的帮助.谢谢.

linux testing bash

72
推荐指数
4
解决办法
5万
查看次数

如何调用bash,在新shell中运行命令,然后将控制权交还给用户?

这必须是非常简单或非常复杂,但我找不到任何关于它...我试图打开一个新的bash实例,然后在其中运行一些命令,并将控件返回给用户内部相同的实例.

我试过了:

$ bash -lic "some_command"
Run Code Online (Sandbox Code Playgroud)

但这会some_command在新实例中执行,然后关闭它.我希望它保持开放.

还有一个可能会影响答案的细节:如果我可以让它工作,我会在我的.bashrc别名中使用它,所以实现的奖励积分alias!

bash shell

70
推荐指数
4
解决办法
8万
查看次数

在shell脚本中回显一些命令行(对于单个命令,回显)

在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 shell echo

21
推荐指数
2
解决办法
7235
查看次数

Bash set -x echo重定向以及命令

我正在编写一个Bash脚本,我希望所有命令在发生时都能回显.我知道我需要分别使用set -xset +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重定向到output1output2.为什么是这样?我怎样才能实现这种行为?也许shopt我必须在脚本中设置一个选项?

注意:我还注意到管道不会按预期打印.例如,如果我要使用此命令:

set -x
./command3 | tee output3
Run Code Online (Sandbox Code Playgroud)

我会得到这个输出:

+ tee output3
+ ./command3
Run Code Online (Sandbox Code Playgroud)

如何使命令完全按照它们的编写方式进行回显,而不是让脚本重新排序管道?

bash pipe io-redirection

11
推荐指数
3
解决办法
4575
查看次数

teamcity如何查看命令行构建步骤自定义脚本的最终输出

给定命令行构建步骤,使用以下自定义脚本:

msdeploy -verb:sync -source:package='%teamcity.build.projectid%\%WebProjectName%.csproj.zip'
Run Code Online (Sandbox Code Playgroud)

我怎么能看到变量最终被替换了?

我没有看到任何"详细日志记录"选项,它保存用于在任何地方调试构建服务器的最终输出

teamcity

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

Bash:执行前突出显示命令(set -x)

我有一个 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\n
Run Code Online (Sandbox Code Playgroud)\n\n

我希望输出是这样的:

\n\n
\n

回显“foo”
\n foo
\n 回显“bar”
\n bar

\n
\n\n

或者可能:

\n\n
\n

echo "foo"
\n foo
\n if [ "value_of_ASD" == "QWE" ] ; 然后
\n echo "bar"
\n bar
\n fi

\n
\n\n

除了用粗体打印命令之外,用颜色突出显示也可以。但我不只是想在命令前面有“+”字符,而且我也不喜欢 if 语句像 那样显示\'[\' value_of_ASD == QWE \']\'

\n\n

我怎样才能用 bash 来实现这一点?

\n\n

目前输出看起来像这样:

\n\n
+ echo …
Run Code Online (Sandbox Code Playgroud)

linux bash shell sh

7
推荐指数
2
解决办法
2152
查看次数

打印执行的命令

如何在鱼壳中打印执行的命令?

我已经尝试过在shell脚本中提供解决方案:在执行命令时回显shell命令,但是它们与fish shell不兼容。

unix shell fish

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

'#!/bin/sh -xe' 是什么意思?

Tribler 的GitHub 上的存储库中,我看到一个带有解释器的文件#!/bin/sh -xe.

在 Mac 和 Linux 上man sh重定向到BASH(1)(与 相同man bash)。

在这个 man 文件中,在以下部分:

选项

,没有提到选项-x,也没有选项-e

口译员的意思是#!/bin/sh -xe什么?

bash sh

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

在 bash 脚本中记录命令行及其输出

有没有一种方法可以让脚本同时记录命令行运行(包括管道运行)及其输出,而无需复制命令行?

目的是脚本应该有一个干净的输出,但应该详细地记录到日志文件中(所以没有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 中)可以实现这一点而不必重复命令?

linux bash

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

在 Bash 中执行命令时是否可以打印所有命令?

如何在执行 shell 命令时回显它们,我已经学会了如何set -v在执行命令时使用打印命令。如果set -v在开始时添加foo.shbash -v foo.sh运行,则效果很好。但是,如果通过或 简单地foo.sh调用,则不会打印中的命令。是否有一个全局开关可以使所有命令和函数通过所有调用的脚本在执行时打印出来?bar.shbash bar.sh./bar.shbar.sh

bash

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

标签 统计

bash ×10

shell ×5

linux ×3

sh ×2

echo ×1

fish ×1

io-redirection ×1

pipe ×1

teamcity ×1

testing ×1

unix ×1