微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

bash – 为什么在论证中间有一个EOF?

我想编写一个小bash函数,这样我就可以告诉bash,import os或sys import stdout,它会在导入模块时生成一个新的Python解释器.

后者从函数看起来像这样:

from () {
    echo "from $@" | xxd
    python3 -i -c "from $@"
}

如果我这样称呼:

$from sys import stdout
00000000: 6672 6f6d 2073 7973 2069 6d70 6f72 7420  from sys import 
00000010: 7374 646f 7574 0a                        stdout.
  File "<string>", line 1
    from sys
           ^
SyntaxError: invalid Syntax
>>> 

来自sys的字节是

66 72 6f 6d 20 73 79 73 20
f  r  o  m     s  y  s    

那里没有EOF,但Python解释器的行为就像它读取EOF一样.流的末尾有一个换行符,这是预期的.

从姐姐那里导入一个完整的python模块,就像这样,通过清理和处理字符串,以及通过在不存在的模块上失败来解决问题.

import () {
  ARGS=$@
  ARGS=$(python3 -c "import re;print(', '.join(re.findall(r'([\w]+)[\s|,]*', '$ARGS')))")
  echo -ne '\0x04' | python3 -i
  python3 -c "import $ARGS" &> /dev/null
  if [ $? != 0 ]; then
    echo "sorry, junk module in list"
  else
    echo "imported $ARGS"
    python3 -i -c "import $ARGS"
  fi
}

解决了流中无法解释的EOF问题,但我想理解为什么Python认为有EOF.

解决方法:

this Stack Overflow answer中的表(从Bash Hackers Wiki获得)解释了如何扩展不同的Bash变量:

你正在使用python -i -c“来自$@”,它变成python -i -c“来自sys”“import”“stdout”,-c只接受一个参数,所以它从sys运行命令.你想使用$*,它将从sys import stdout扩展为python -i -c“(假设$IFS未设置或以空格开头).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐