bash-скрипт: как «выйти» из исходного кода и разрешить работать без исходного кода? - PullRequest
1 голос
/ 04 октября 2019

У меня есть сценарий, который я хотел бы, чтобы люди получали, но по желанию. Таким образом, они могут запускать его с использованием или без него, это зависит от них.

Например, должны работать оба следующих параметра:

$ . test.sh $ test.sh

Проблема в том,, test.sh содержит exit операторов, если правильные аргументы не передаются. Если кто-то создает сценарий, то команды exit выходят из терминала!

Я провел небольшое исследование и вижу, из этого поста StackOverflow , который я мог бы определить, получен ли он из источника, и сделать что-то другое, но что это будет за другое?

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Обычный способ выхода из сценария с источником - просто return (при желании добавление нужного кода выхода) вне какой-либо функции. Предполагая, что при запуске в качестве команды у нас установлен флаг -e, это также приведет к выходу из программы оболочки:

#!/bin/sh -eu

if [ $# = 0 ]
then
    echo "Usage $0 <argument>" >&2 
    return 1
fi

Если мы работаем без -e, мы можем return || exit вместо.

1 голос
/ 04 октября 2019

Возможно, есть лучшие способы сделать это, но вот пример сценария, показывающий, как я заставил это работать:

bparks@home 
$ set | grep TESTVAR

bparks@home 
$ ./test.sh

  Outputs some useful information to the console. Please pass one arg.

bparks@home 
$ set | grep TESTVAR

bparks@home 
$ . ./test.sh

  Outputs some useful information to the console. Please pass one arg.

bparks@home 
$ set | grep TESTVAR

bparks@home 
$ ./test.sh asdf
export TESTVAR=me

bparks@home 
$ set | grep TESTVAR

bparks@home 
$ . ./test.sh asdf

bparks@home 
$ set | grep TESTVAR
TESTVAR=me

bparks@home 
$

test.sh

#!/usr/bin/env bash

# store if we're sourced or not in a variable
(return 0 2>/dev/null) && SOURCED=1 || SOURCED=0

exitIfNotSourced(){
  [[ "$SOURCED" != "0" ]] || exit;
}

showHelp(){
  IT=$(cat <<EOF

  Outputs some useful information to the console. Please pass one arg.

EOF
  )
  echo "$IT"
}

# Show help if no args supplied - works if sourced or not sourced
if [ -z "$1" ]
then
  showHelp

  exitIfNotSourced;
  return;
fi

# your main script follows 
# this sample shows exporting a variable if sourced, 
# and outputting this to stdout if not sourced

if [ "$SOURCED" == "1" ]
then
  export TESTVAR=me
else
  echo "export TESTVAR=me"
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...