gpt4 book ai didi

linux - Bash 在多台服务器上运行 rsh

转载 作者:太空宇宙 更新时间:2023-11-04 09:32:14 24 4
gpt4 key购买 nike

我有一个这样的服务器列表文件:

xxx ServerName1 xxx
xxx ServerName2 xxx
...

现在我想去每个服务器从本地重命名一个文件。我的 Bash 脚本是这样的:

#!/bin/bash

while read line
do
server=`echo $line | awk '{print $2}'` # get server name
rsh $server mv /a/b/c.txt /a/b/d.txt # rename on the server
echo "rename file in $server" # print echo
done < server.txt

但是,它只会转到第一个“SeverName1”,重命名文件并打印回显。它永远不会转到其余服务器,甚至不打印回显。我不知道为什么它只适用于第一个。

有人帮我吗?

最佳答案

不要让 rsh吃掉输入流的其余部分——如果吃掉了,while read 就没有什么可读的了。下次循环尝试开始。最简单的方法是将其标准输入从 /dev/null 重定向。 :

rsh "$server" mv /a/b/c.txt /a/b/d.txt </dev/null

或者,您可以遍历 0 以外的 FD(请注意,在这里使用 awk 是愚蠢的;您可以告诉 bash 本身只从每一行中挑选出第二个字段,我在下面的代码中就是这样做的):

while read -u 3 _ server _; do              # get server name (with read)
rsh "$server" mv /a/b/c.txt /a/b/d.txt # rename on the server
echo "rename file in $server" # print echo
done 3< server.txt

解释一些可能不太明显的要点:

  • 3是文件描述符编号;它需要在 -u 3 之间匹配和 3< server.txt .您可以选择使用 read _ server _ <&3而不是依赖 read -u ,如果您希望您的代码与 bash 以外的 shell 兼容。
  • _我们吃你不想要的田地read将内容放入。 read _ server _将第一个字段放入 _ ,第二个字段变成server , 和第三个及以后的字段到 _ .

关于linux - Bash 在多台服务器上运行 rsh,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30226936/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com