如果我在手动执行每一行时取出循环和变量,不明白为什么我的代码可以工作。一开始我以为我的变量是错误的,但后来我用这些变量测试了我的代码,但没有循环,它起作用了。
如果我回到循环中(我唯一要更改的东西),我会得到这些奇怪的 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 错误以及为什么当我将其放入循环中时它会停止工作?
最佳答案
输入重定向 <usernames.txt
正在用文件 usernames.txt
替换标准输入.因此终端不再是输入,导致这些错误。解决此问题的一种方法是使用标准输入以外的文件描述符,例如:
while read p <&3; do
…
done 3<usernames.txt
您遇到的另一个问题是循环内的命令是在本地执行的,而不是超过ssh
。在远程机器上,所以 exit
将退出您的本地 shell(在您通过手动注销从 ssh
返回后)。您可以在 ssh
上放置要远程执行的命令命令行(参见 ssh
手册,或例如 this question ),这可能会消除您首先将终端作为标准输入的需要。
关于c - 有循环的 Stty 错误,没有循环没有 stty 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24868099/