为什么bash脚本不运行.sh?



我有一个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字节)和参数传递方面受到限制:即它们只支持参数。

相关内容

  • 没有找到相关文章

最新更新