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未设置或以空格开头).

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...