循环的stty错误,没有循环没有stty错误

时间:2014-07-21 14:49:10

标签: c linux bash unix

如果我在手动执行每一行时取出循环和变量,不明白为什么我的代码有效。首先我认为我的变量是错误的,但后来我用变量测试了我的代码,但没有循环,它起作用了。

如果我回到循环中(我唯一要做的就是改变),我会得到这些奇怪的stty错误。

while read p; do
    #Send file
    scp random_file.txt $p:/me/folder"

    #Log in
    ssh $p"@myserver.txt"

    #List file, extract file, append file
    #Code here

    #log out
    exit

done <usernames.txt

我已经搜索了这个错误(这是一个非常常见的错误)令人作呕,但没有一个解决方案正在运行。禁用伪tty分配也不会强制伪tty分配为我工作。无论选项

,我总是会收到错误

-t -t选项

tcgetattr: Inappropriate ioctl for device

-t选项

Pseudo-terminal will not be allocated because stdin is not a terminal.    
stty: : Invalid argument

-T选项

stty: : Invalid argument

那么我如何解决这些stty错误以及为什么当我将它放入循环时它会停止工作?

2 个答案:

答案 0 :(得分:1)

<usernames.txt的输入重定向正在用文件usernames.txt替换标准输入。因此,终端不再是输入,导致这些错误。解决此问题的一种方法是使用标准输入以外的文件描述符,例如:

while read p <&3; do
    …
done 3<usernames.txt

你遇到的另一个问题是循环中的命令是在本地执行的,而不是在远程机器上的ssh上执行的,因此exit将退出本地shell(从{{1返回后)通过手动注销)。您可以将命令放在ssh命令行上远程执行(请参阅ssh手册,或者,例如this question),这可能会消除您将终端作为标准输入的需要。第一名。

答案 1 :(得分:1)

当交互式将您带入远程shell时,

ssh。脚本中的ssh不会这样做。当以这种方式编写脚本时,在ssh行之后的循环体是在远程系统上发生。它发生在当地。

如果要在该ssh连接的上下文中运行远程计算机上的代码,则需要将其全部写为ssh命令的命令参数和/或在远程计算机上编写脚本,将该脚本作为ssh命令参数执行。