2015-05-25 194 views
0

我在下面在Ubuntu Linaro(在Parallella上)看到的奇怪行为刻意挠头。这scp命令正常工作本身:TCSH脚本和scp命令

$ scp [email protected]:~/myMPI/filename [email protected]:~/myMPI/ 

但是,一旦我把它包装成一个脚本:

#!/bin/tcsh -f 

scp [email protected]:~/myMPI/$1 [email protected]:~/myMPI/ 

,并发出它,我得到这个:

$ thescript filename 

user: invalid user name 

没有空格或用户名中的句点,而且在命令行上也会失败,而不仅仅是在脚本中。不过,tcsh以某种方式改变了scp命令。

帮助?

+2

脚本以'#!/ bin/sh -f'开头,所以它是Bourne shell脚本,而不是tcsh脚本。 tcsh脚本需要'#!/ bin/tcsh -f',其中'-f'告诉shell不要加载启动文件。 '/ bin/sh'的'-f'选项完全不同(它禁用了路径名扩展),并且在这里你不需要它。 –

+0

我的部分出现复制粘贴错误,现在已修复。不幸的是,问题依然存在。 – Urhixidur

+0

我无法重现该问题。这是你的tcsh脚本的* exact *内容,还是你修改了它的发布? (用户名真的是'用户',主机名是'UNIT1'和'UNIT2'?) –

回答

0

Kenster钉了它:隐藏在脚本文件中用户名前面的寄生$ C2(?)$ AD(软连字符)字符对。我不确定他们是如何进入的(也不知道Leafpad没有显示它们的原因),但现在他们已经离开了,脚本按预期工作。

也感谢Keith Thompson的尝试。

0

这里是scp程序发出该误差范围内的代码:

int 
okname(char *cp0) 
{ 
    int c; 
    char *cp; 

    cp = cp0; 
    do { 
     c = (int)*cp; 
     if (c & 0200) 
      goto bad; 
     if (!isalpha(c) && !isdigit((unsigned char)c)) { 
      switch (c) { 
      case '\'': 
      case '"': 
      case '`': 
      case ' ': 
      case '#': 
       goto bad; 
      default: 
       break; 
      } 
     } 
    } while (*++cp); 
    return (1); 

bad: fprintf(stderr, "%s: invalid user name\n", cp0); 
    return (0); 
} 

它不接受包含字符以上127序号值,或某些标点字符的用户名。据推测,脚本中的一个编辑用户名违反了这些条件之一。不速之客,我怀疑的第一件事是你有一个重音字符,或者可能是一些unicode文本。

+0

不是。用户名是'linaro'。而且,如果出现这种情况,错误将再次显示在命令行上。不,这是tcsh和scp之间的一些奇怪的交互。 – Urhixidur

+0

您可以尝试通过“od -a”运行脚本文件,以查看是否有任何有趣的字符。 – Kenster