这个名字很奇怪的“heredocuments”允许您在Linux上的Bash脚本中使用输入/输出重定向。他们是一个伟大的方式来自动化命令,你需要在远程计算机上运行。
Linux中的许多命令都有两个或三个字母的名称。这在一定程度上导致了这样一种观念:Linux很难学习,而且充满了神秘的命令。但是Linux中最奇怪的名字之一并不是一个神秘的短名字。“Here documents”不是文档,也不清楚“Here”指的是什么。
它们是一个相对模糊的结构,但它们是有用的。当然,这是Linux操作系统,所以剥猫皮的方法不止一种。这里提供的一些功能可以通过其他方式复制。这些替代方法通常更复杂。在编程和脚本中,“更复杂”也意味着“更容易出现错误”,而且代码更难维护。
这里真正的excel文档是自动化命令,您希望通过脚本中建立的连接将这些命令发送到远程计算机。建立连接很容易,但是一旦建立了连接,如何将脚本中的命令“泵送”到远程计算机的shell中?这里的文档让您可以非常简单地做到这一点。
here文档的惯用表示形式如下所示:
COMMAND << limit_string . . text data variables . . limit_string您可能会在这里看到使用“EOF”作为限制字符串的文档示例。我们不赞成这种做法。它可以工作,但“EOF”意味着“文件结束”。除了极少数情况下主文档是脚本文件中的最后一个内容外,“EOF”被错误地使用。
如果您使用一个引用您正在执行的操作的限制字符串,它将使您的脚本更具可读性。如果您通过secureshell(SSH)向远程计算机发送一系列命令,那么一个名为“\u remote\u commands”的限制字符串将非常有意义。您不需要用下划线“216;”字符开头。我们这样做是因为它在你的剧本中把它们标记为不同寻常的东西。
您可以在命令行和脚本中使用此处的文档。在终端窗口中键入以下内容时,每次点击“Enter”时,都会看到“>;”行继续提示。键入“\u text的结束”限制字符串并点击“Enter”时,网站列表将传递给cat,并显示在终端窗口中。
cat << _end_of_text How-To Geek Review Geek LifeSavvy CloudSavvy IT MindBounce _end_of_text这不是最有价值的练习,但它确实演示了在整理整个数据列表并遇到限制字符串之前,不会向命令发送任何内容。在输入限制字符串“\u end\u of \u text”并按“enter”键之前,cat命令不会接收任何输入。
我们可以在剧本里做同样的事情。在编辑器中键入或复制此示例,将文件另存为“heredoc-1.sh”,然后关闭编辑器。
#!/bin/bash cat << "_end_of_text" Your user name is: $(whoami) Your current working directory is: $PWD Your Bash version is: $BASH_VERSION _end_of_text在阅读本文时,每次创建脚本时,都需要使其在运行之前可执行。在每种情况下,使用chmod命令。将每个示例中的脚本名称替换为此处使用的脚本名称。
chmod +x heredoc-1.sh这个脚本包含两个环境变量,$PWD和$BASH\u VERSION。执行脚本时,环境变量名将替换为当前工作目录和Bash版本中的数据值。
该脚本还对whoami命令使用命令替换。命令的名称将替换为它自己的输出。整个脚本的输出由cat命令写入终端窗口。我们通过名字来运行脚本:
./heredoc-1.sh如果修改脚本并将限制字符串括在here文档的第一行的引号“”中,则数据列表将逐字传递给here文档命令。将显示变量名而不是变量值,并且不会进行命令替换。
#!/bin/bash cat <<- "_end_of_text" Your user name is: $(whoami) Your current working directory is: $PWD Your Bash version is: $BASH_VERSION _end_of_text./heredoc-1.sh
默认情况下,数据列表中的制表符将保留并写入终端窗口。复制这个例子并保存为“herdeoc-2.sh”。使用chmod命令使其可执行。编辑缩进的行,以确保它们在行首有一个或两个制表符,而不是一系列空格。
#!/bin/bash cat << _end_of_text Your user name is: $(whoami) Your current working directory is: $PWD Your Bash version is: $BASH_VERSION _end_of_text ./heredoc-2.sh选项卡将写入终端窗口。
通过向重定向操作符添加破折号“-”,here文档将忽略前导制表符。将此示例另存为“heredoc-3.sh”,并使其可执行。
#!/bin/bash cat <<- _end_of_text Your user name is: $(whoami) Your current working directory is: $PWD Your Bash version is: $BASH_VERSION _end_of_text ./heredoc-3.sh这些选项卡将被忽略。这看起来可能很琐碎,但这是一种处理前导制表符的好方法,因为前导制表符是脚本的缩进部分。
循环和其他逻辑结构通常是缩进的。如果您的here文档包含在脚本的缩进部分中,则在重定向操作符中使用破折号“-”可以消除由前导制表符引起的格式问题。
#!/bin/bash if true; then cat <<- _limit_string Line 1 with a leading tab. Line 2 with a leading tab. Line 3 with a leading tab. _limit_string fi与here文档一起使用的命令的输出可以重定向到一个文件中。在here文档第一行的limit字符串后面使用“>;”(创建文件)或“>;”(如果文件不存在,则创建文件,如果文件存在,则附加到文件)重定向运算符。
这个脚本是“heredoc-4.sh”。它将把输出重定向到一个名为会话.txt.”
#!/bin/bash cat << _end_of_text > session.txt Your user name is: $(whoami) Your current working directory is: $PWD Your Bash version is: $BASH_VERSION _end_of_text ./heredoc-4.sh cat session.texthere文档中使用的命令的输出可以通过管道作为另一个命令的输入。在here文档第一行的limit字符串后面使用pipe“|”操作符。我们将把here document命令cat的输出导入sed。我们想用字母“e”替换字母“a”的所有出现处。
将此脚本命名为“heredoc-5.sh”
#!/bin/bash cat << _end_of_text | sed 's/a/e/g' How To Gaak _end_of_text ./heredoc-5.sh“Gaak”改为“Geek”
与here文档一起使用的命令可以是脚本中的函数。
此脚本将一些车辆数据传递到函数中。函数读取数据时,就好像它是由用户键入的一样。然后打印变量的值。将此脚本另存为“heredoc-6.sh”。
#!/bin/bash # the set_car_details() function set_car_details () { read make read model read new_used read delivery_collect read location read price } # The here document that passes the data to set_car_details() set_car_details << _mars_rover_data NASA Perseverance Rover Used Collect Mars (long,lat) 77.451865,18.445161 2.2 billion _mars_rover_data # Retrieve the vehicle details echo "Make: $make" echo "Model: $model" echo "New or Used: $new_used" echo "Delivery or Collection: $delivery_collect" echo "Location: $location" echo "Price \$: $price" ./heredoc-6.sh车辆详细信息将写入终端窗口。
我们可以使用here文档来撰写和发送电子邮件。注意,我们可以将参数传递给重定向操作符前面的命令。我们使用Linux mail命令通过本地邮件系统向名为“dave”的用户帐户发送电子邮件。-s(主题)选项允许我们指定电子邮件的主题。
此示例形成脚本“heredoc-7.sh”
#!/bin/bash article="Here Documents" mail -s 'Workload status' dave << _project_report User name: $(whoami) Has completed assignment: Article: $article _project_report ./heredoc-7.sh此脚本没有可见的输出。但当我们检查邮件时,我们发现邮件是由人撰写、发送和传递的。
mail这里的文档是在建立SSH连接后在远程计算机上执行某些命令的一种强大而方便的方法。如果您在两台计算机之间设置了SSH密钥,那么登录过程将是完全自动的。在这个又快又脏的例子中,会提示您输入远程计算机上用户帐户的密码。
这个脚本是“hereoc-8.sh”。我们要连接到一台名为“远程pc”的远程计算机。用户帐户称为“dave”。我们使用-T(disable伪终端分配)选项,因为我们不需要为我们分配一个交互式伪终端。
在脚本的“在这里做一些工作”部分,我们可以传递一个命令列表,这些命令将在远程计算机上执行。当然,您可以调用远程计算机上的脚本。远程脚本可以保存您想要执行的所有命令和例程。
我们的script-heredoc-8.sh要做的就是更新远程计算机上的连接日志。用户帐户和时间和日期戳被记录到一个文本文件中。
#!/bin/bash ssh -T [email protected] << _remote_commands # do some work in here # update connection log echo $USER "-" $(date) >> /home/dave/conn_log/script.log _remote_commands当我们运行命令时,系统会提示我们输入远程计算机上帐户的密码。
./heredoc-8.sh将显示有关远程计算机的一些信息,并返回到命令提示符。
在远程计算机上,我们可以使用cat检查连接日志:
cat conn_log/script.log为我们列出了每个连接。
相关:如何从Linux Shell创建和安装SSH密钥
这里的文档很奇怪,但功能强大,尤其是用于向远程计算机发送命令时。使用rsync编写备份例程很简单。然后,脚本可以连接到远程计算机,检查剩余的存储空间,并在空间不足时发送警报电子邮件。
相关:如何备份Linux系统
... 本课程将带您了解Linux的“如何”和“为什么”,并展示各种Linux命令的工作方式、它们的真实结构以及记住这些命令的正确方法。 ...
... 在本文中,我将向您展示如何在Linux上安装、运行和使用PowerShell! ...
...更多的特性。了解更多关于Bash-on-Windows的信息,从您应该如何以及为什么安装它,到您可能不知道的隐藏特性。 ...
... 如何在windows10上安装linux bash shell ...
Linux上有多种类型的环境变量。了解如何查看它们,为本地和远程登录创建它们,并使它们在重新启动后仍然有效。 环境变量的工作原理 启动终端窗口及其内部的shell时,会引用一组变量,以确保shell配置正确。这些变量还确...
...在shell中的,因此Bash不必费劲地查找这些命令。 但是Bash如何定位其他命令、程序和外部独立二进制文件呢?Bash使用路径,实际上是一组路径,每个路径指向一个目录。然后,它在每个目录中搜索与您试图运行的命令或程序匹配...
...法是安装足够的操作系统,以完成所需的任务。通过查看如何使用chroot环境来回答“what is required”问题。 一些常见用途是: 软件开发和产品验证。开发人员编写软件,产品验证团队(PV)对其进行测试。有时PV发现的问题无法...
...些指南汇总到一个大列表中。 windows上linux入门 相关:如何在windows10上安装和使用Linux Bash Shell 您可以在任何版本的windows10(包括windows10home)上安装Linux环境和bashshell。但是,它确实需要64位版本的Windows10。您只需启用Windows Subs...
...改这些凭据。 用户帐户在linux环境中的工作方式 相关:如何在windows10上安装和使用Linux Bash Shell 当您通过在安装后启动新的Linux发行版来设置它时,系统会要求您为bashshell创建一个用户帐户。Windows将其称为“UNIX用户帐户”。因...