执行./ not sh

时间:2017-08-17 14:19:47

标签: bash unix

这是我当前代码的一部分

#! /bin/bash

#Take no arguments in
#checks to see if home/deleted is in existence
#creates the directory or file if it is missing
**(line 15)** function checkbin(){

    if [ ! -c "~/deleted" ]; then
            mkdir -p ~/deleted
    fi
    if [ ! -f "~/.restore.info" ]; then
            touch ~/deleted/.restore.info
    fi

}

我可以使用./remove [ARGS] 正确调用此代码 但是当我使用sh remove [ARGS]打电话时 我收到以下错误remove: 15: remove: Syntax error: "(" unexpected

文件-rwxr-x--x

上的

ls -l

unix是否支持sh和./?

的执行

2 个答案:

答案 0 :(得分:1)

当使用./ / bin / bash执行时(如shebang中所定义),而sh可能是另一个解释器或bash的链接,根据它的调用方式可能会有不同的行为sh

bash派生自sh,但有一些特定的语法:

例如在sh Function Definition Command

fname() compound-command[io-redirect ...]

没有function关键字。

了解更多详情

Bash

Posix shell

答案 1 :(得分:1)

如果您希望脚本在sh以及bash中运行,则需要写入POSIX shell标准。

在这种情况下,这意味着不使用Bash function关键字:

checkbin(){
    test -c "~/deleted" || mkdir -p ~/deleted
    test -f  "~/.restore.info" || touch ~/deleted/.restore.info
}

如果你正在编写便携式外壳,那么使用#!/bin/sh作为你的朋友是个好主意。

(顺便说一句,我认为您已经意识到"~/deleted"~/deleted并不相同?)