함수 호출에서 별칭 끝에 heredoc(<<)를 추가합니다.

함수 호출에서 별칭 끝에 heredoc(<<)를 추가합니다.

데이터베이스에 대한 psql 연결 문자열인 별칭이 있습니다. 별칭이 다음과 같다고 가정해 보겠습니다.

alias GQQ='psql "host=$host user=$redshift_uname dbname=$redshift_dbname port=$port pass word=$redshift_pwd"'

이 별칭은 데이터베이스에 연결할 수 있도록 존재하지만 데이터베이스에 간단한 쿼리를 보내는 함수에서 이를 호출하고 싶습니다.

일반 터미널에서 First: GQQ <<EOFSecond: <QUERY> ex. SELECT * FROM table LIMIT 10;및 Third:를 실행할 수 있으며 EOF쿼리 결과가 반환됩니다.

다음과 같이 이 기능을 시뮬레이션하는 함수를 만들고 싶습니다.

function qredshift() {

    GQQ <<EOF
    $*
    EOF

}

하지만 이것을 공식화하는 방법을 잘 모르겠습니다. 쉘에서 시도하고 다른 위치에 따옴표를 추가했습니다. 이것을 실행하는 올바른 방법은 무엇입니까?

답변1

EOF구분 기호로 간주되려면 줄의 전체 내용이 필요합니다 .

qredshift() {
   local IFS=' '
   psql "host=$host user=$redshift_uname dbname=$redshift_dbname port=$port password=$redshift_pwd" <<EOF
$*
EOF
}

이 문서에서 $*가 발견되면 위치 인수는 $IFS쉘에 따라 첫 번째 문자 또는 공백과 연결됩니다. 따라서 IFS쉘 간에 동작이 일관되도록 공간을 설정했습니다. 에서는 명시적인 연결 공백을 zsh사용할 수도 있습니다 ${(j[ ])@}.

여기에 있는 문서 외에도 다음을 사용할 수 있습니다.

printf '%s\n' "$*" | psql...

또는:

printf '%s\n' "$@" | psql...

각 인수를 qreshift별도의 입력 줄로 전달합니다 psql.

또는 zsh 스타일 here-string을 사용하십시오(현재 bash 및 기타 쉘에서 지원됨).

psql... <<< "$*"

psql(이것이 postgresql 클라이언트라고 가정) SQL 쿼리를 사용하여 실행할 수도 있으므로 -c다음과 같습니다.

psql -c "$*" ...

매개변수가 제공되지 않은 경우 qredshift매개변수 또는 stdin에서 SQL 코드를 가져오려면 다음을 수행할 수 있습니다.

qredshift() {
   local IFS=' '
   psql ${1+"-c$*"} "host=$host user=$redshift_uname dbname=$redshift_dbname port=$port password=$redshift_pwd"
}

그러면 다음과 같이 할 수 있습니다:

qredshift 'select * from...'
qredshift <<< 'select * from...'
qredshift << 'EOF'
select * from...
EOF

비밀번호는 시스템 내 공개 정보이므로 명령줄에서 비밀번호를 전달하는 것은 좋지 않습니다.

환경 변수는 비공개 이므로 매개변수 대신 환경 변수를 통해 비밀번호를 전달하는 것이 PGPASSWORD="$redshift_pwd" psql ...더 안전합니다.

관련 정보