Shell 命令名称中的星号作何解释?


#1

从 iTerm2 的 Python API 文档上提到:

~/Library/ApplicationSupport/iTerm2/iterm2env/versions/*/bin/python3 YourScript.py

假设 versions 下只有一个文件夹到没有歧义,但如果有多个该怎么办,Shell 应该有规定,但我不知道从哪里找。

我试了下貌似是选择按名称排序(同 ls(1) 的默认排序)的第一个,但是我还是想知道对应的解释。

测试
mkdir -p /tmp/versions/{1,2,3}
echo 'echo 1' > /tmp/versions/1/run
echo 'echo 2' > /tmp/versions/2/run
echo 'echo 3' > /tmp/versions/3/run
chmod +x /tmp/versions/*/run

~ $ tree /tmp/versions
/tmp/versions
├── 1
│   └── run
├── 2
│   └── run
└── 3
    └── run

3 directories, 3 files
~ $ /tmp/versions/*/run
1
~ $

#2

把你的测试文件改一下,变成:

$ cat /tmp/versions/*/run
echo 1: $@
echo 2: $@
echo 3: $@

每个 run 都把参数打印出来。

再测试:

$ /tmp/versions/*/run foo
1: /tmp/versions/2/run /tmp/versions/3/run foo

结果跟手动展开通配符是一样的:

$ /tmp/versions/1/run /tmp/versions/2/run /tmp/versions/3/run foo
1: /tmp/versions/2/run /tmp/versions/3/run foo

2/run3/run 都变成了 1/run 参数。

文档提到的 bin/python3 到底是什么,是一个名为 python3 的脚本,还是一个指向 python3 解释器的链接?如果是前者,它应该要能处理通配符展开之后的情况,否则应该会出错。如果是后者,应该也会出错吧?我没试过在命令行执行 $ /path/to/python35 /path/to/python36 /path/to/python37 MyScript.py 不知会出现什么情况


#3

哦,原来是普通的通配符展开,我误以为是有特殊规定。

是个脚本二进制可执行文件。

这个文档不太清楚,误导了我,它之所以能工作是因为目前我的 versions/ 下只有一个 3.7.2。不过我想它主要是不想用特定的 Python 版本,因为每个人的 Python 版本多半不同。

文档在这里:https://iterm2.com/python-api/tutorial/running.html#command-line


#4

会报错,/usr/local/bin/python3 不是文本文件:

~ $ /usr/local/bin/python3 /usr/local/bin/python3 test.py
  File "/usr/local/bin/python3", line 1
SyntaxError: Non-UTF-8 code starting with '\xcf' in file /usr/local/bin/python3 on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
~ $

能够在一个 Python 里运行另一个 Python 不太可能故意为之。

此外 python 一次只能运行一个脚本:

~ $ cd /tmp
/tmp $ echo 'print(1)' > 1.py
/tmp $ echo 'print(2)' > 2.py
/tmp $ echo 'print(3)' > 3.py
/tmp $ python3 1.py 2.py 3.py
1
/tmp $