bash의 여러 줄 별칭


13

다음 스크립트가 있습니다. a문자열 값 b이 있고 경로 여야하는 간단한 테스트 사례 입니다.

#!/bin/bash

alias jo "\
echo "please enter values "\
read a \
read -e b \
echo "My values are $a and $b""

그러나 ./sample.sh를 실행하려고 할 때마다 다음 오류가 발생합니다.

./sample.sh: line 3: alias: jo: not found
./sample.sh: line 3: alias: echo please: not found
./sample.sh: line 3: alias: enter: not found
./sample.sh: line 3: alias: values: not found
./sample.sh: line 3: alias: read a read -e b echo My: not found
./sample.sh: line 3: alias: values: not found
./sample.sh: line 3: alias: are: not found
./sample.sh: line 3: alias: and: not found
./sample.sh: line 3: alias: : not found

내가 시도 source sample.sh하면 다음과 같은 결과가 나타납니다.

a: Undefined variable.

내 목표는이 스크립트를 소싱하고 명령 줄을 실행하기 위해 별칭을 실행할 수 있도록 별칭을 만드는 것이 었습니다. 누군가 이것을보고 오류가 무엇인지 알려 줄 수 있습니까?


3
여러 줄과 여러 명령 별칭이 필요하다고 생각되면 함수를 정의하거나 스크립트를 만들어야합니다.
Sergiy Kolodyazhnyy

@SergiyKolodyazhnyy는 주목
Jovin 미란다

답변:


15

여기 몇 가지 문제가 있습니다.

  1. 달리 csh에서 bash(그리고 다른 하나는 본쉘), 별칭은 할당되는 =기호의 예alias foo=bar

  2. 따옴표는 그렇게 중첩 될 수 없습니다. 이 경우 별칭 주위에 작은 따옴표를 사용하고 안에 큰 따옴표를 사용할 수 있습니다

  3. 백 슬래시 \줄 연속 문자입니다. 문법적으로는 명령을 줄로 만듭니다 (원하는 것과 반대).

그래서

#!/bin/bash

alias jo='
echo "please enter values "
read a 
read -e b 
echo "My values are $a and $b"'

테스트 : 먼저 파일을 소싱합니다.

$ . ./myscript.sh

그때

$ jo
please enter values 
foo bar
baz
My values are foo bar and baz

스크립트 에서 별칭을 사용하려면 대화식 쉘에서만 별칭이 기본적으로 활성화되어 있음을 기억하십시오. 스크립트 에서 별칭을 활성화하려면 추가해야합니다.

shopt -s expand_aliases

위의 모든 것에 관계없이 이와 같은 것들에 대한 별칭 대신 쉘 함수 사용을 고려해야합니다


1
별칭 주위에 작은 따옴표를 사용하는 또 다른 이유는 큰 따옴표 안에 변수가 너무 확장된다는 것입니다 $a$b별명이 실행하지 않을 때, 정의시에 확장 될 것이다.
Barmar

솔루션 주셔서 감사합니다, 여기에 문제는 내가 당신에 의해 주어진 스크립트를 작성에도 불구하고 내가 그것을 실행할 때 나는 jo를 얻는다 : 명령이 어떤 이유로 인해 별칭을 찾을 수 없습니다. 내가 파일을 소스 할 때이 오류 Unmatched "가 발생합니다. 별칭과 기능을 수행하지 않는 유일한 이유는 명령 줄 에서이 코드 줄을 호출하고 함수에서 어떻게 달성하는지 알지 못하기 때문입니다. 별칭의 사용법은 함수처럼 사용하고 필요할 때마다 호출 할 수 있도록하는 것입니다.
Jovin Miranda

어쨌든 그것을 고쳤습니다. 기본 쉘을 tcsh로 사용했기 때문에 문제가 발생했습니다.
Jovin Miranda

8

POSIX 유형 쉘에서 함수 사용에 익숙해 지십시오. 인용 문제가 없습니다.

jo () {
    read -p "Enter value for 'a': " -e a 
    read -p "Enter value for 'b': " -e b 
    echo "My values are $a and $b"
}

솔루션 주셔서 감사합니다, 이것은 스크립트 내에서 함수를 호출 할 때 작동했습니다. 명령 줄 자체에서 함수를 호출하는 방법은 여러 스크립트가 있고 모든 함수를 하나의 파일로 작성하지만 대신 명령 줄에서 호출하는 상황을 원합니다. 그게 내가 별칭에 갔다 온 이유였다
Jovin 미란다

정확히 동일합니다. 파일에있는 파일과 소스의 기능을 넣어
글렌 잭맨

내가 실제로 한 일은 foll을 사용하는 것입니다. 파일을 실행하는 동안 함수 이름을 호출 할 수 있도록 "$ @"명령
Jovin Miranda
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.