让Bash脚本打印执行的命令

62

我将一堆别名命令放在一个文件夹中,主要是SSH,所以不必再输入...

ssh [user]@[server]

每天我需要做10次,只需要输入...

server

...并且别名脚本被触发。该脚本只是命令...

ssh [user]@[server]

这一切都很好,但我想知道在Bash中是否有一种方法,可以不静默地执行ssh命令,而是显示正在执行的命令?

3个回答

79
你可以使用-x来调试脚本,它将回显命令和参数。你可以从这里获取更多信息。
bash -x script.sh

你也可以针对文件的特定部分执行此操作(来自上面链接的第2.3.2节):

set -x          # activate debugging from here
ssh user@example.com ...
set +x          # stop debugging from here
< p > -x 的输出可能对你寻找的内容有点冗长,因为它是用于调试而不是记录日志。

您最好只编写自己的echo语句 - 这将使您完全掌控输出。


这有点违背别名的目的。除非有其他想法,否则我将在实际命令上方添加一个回显,并查看其效果。 - scphantm
@scphantm - 是的,它确实不是用来记录日志的,更多的是用于调试。但它能胜任工作。可能有更好的解决方案。添加自己的 echo 语句可能是最好的选择;那样你就完全掌控了日志记录。我已经将其纳入我的答案中。 - Rob Hruska

17

在脚本的顶部而不是命令行中添加"-x":

文件 server

#!/bin/bash -x
ssh user@server

执行

./server

导致结果为:

+ ssh user@server
user@server's password: ^C

我从来不知道你可以在shebang行上放置这些参数,我总是在单独的一行上使用set -x,这样看起来更好看。 - undefined

2
现有的答案已经回答了标题中的问题。但我想解决更有效地SSH到服务器的潜在问题。
与其创建一堆bash脚本别名,更好的方法是使用ssh_config文件。
如果您将此放入~/.ssh/config中:
Host deadpool
    Hostname abcdefghijklmnop.my.verbose.hosting-service.com
    User scphantm
    # Lots of other useful options here

那么,不要输入这个:

$ ssh scphantm@abcdefghijklmnop.my.verbose.hosting-service.com

你可以这样做:
$ ssh deadpool

或者

$ scp deadpool:/var/log/apache/access.log access_logs.txt

或者

$ any_other_ssh-based_command deadpool

配置文件参考:

Host 限制以下声明(直到下一个 Host 关键字)仅适用于与关键字后给定的模式之一匹配的主机。

HostName
指定要登录的实际主机名。这可用于指定主机的昵称或缩写。默认值是命令行上给出的名称。数字 IP 地址也被允许(无论是在命令行上还是在 HostName 规范中)。

User
指定要登录的用户。当在不同的机器上使用不同的用户名时,这很有用。这样可以避免记住在命令行上给出用户名的麻烦。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接