我有一个bash脚本,被错误地命名为。py(例如test.py)该脚本运行没有任何问题。(./test.py)如果它可能有用,下面是ls -l命令中的信息:
我的问题是为什么脚本(test.py)执行时没有被正确命名为(test.sh)它会引起问题吗?
脚本内容如下:
#!/bin/bash
export SINGULARITYENV_LC_ALL=C.UTF-8
export SINGULARITYENV_LANG=C.UTF-8
CONTAINER=/mnt/pynet-pytorch-181.sif
# Pretrain
DATA=/mnt/Dataset/
EXPERIMENT_NAME=./2022_12_16/
srun -c 4 --gres=gpu:a6000:1 --mem=32G singularity exec -B /mnt:/mnt/
--nv $CONTAINER
python train.py --dataroot $DATA
--device "cuda"
--pre_denoising False
--experiment_name $EXPERIMENT_NAME
--epochs 200
我试着运行另一个有相同命名问题的bash脚本*.py同样,它执行起来没有问题。我不明白为什么它能工作。
unix不关心扩展。如果文件是可执行+可读的(对于二进制文件,它甚至不需要是可读的),并且以#!
开头,那么它后面的可执行文件将以脚本的名称作为参数调用。
在您的示例中,操作系统将执行/bin/bash path_to_your_script YourArguments...
。bash
也不关心扩展
注意:为了更好的可移植性,您可能希望使用#!/urs/bin/env bash
而不是#!/bin/bash
,因为并非所有系统都在/bin/bash
上使用bash (env将使用$ path环境变量查找实际路径)。或者在/bin/sh
处使用POSIX shell。正如Elliott Frisch所建议的那样,您可能还需要阅读https://en.wikipedia.org/wiki/Shebang_(Unix),特别是如果您想要混乱自定义shebang行,因为shebang行本身不是脚本,并且在长度(如128或256字节)和参数传递方面受到限制:即它们只支持参数。