데이터베이스에 대한 psql 연결 문자열인 별칭이 있습니다. 별칭이 다음과 같다고 가정해 보겠습니다.
alias GQQ='psql "host=$host user=$redshift_uname dbname=$redshift_dbname port=$port pass word=$redshift_pwd"'
이 별칭은 데이터베이스에 연결할 수 있도록 존재하지만 데이터베이스에 간단한 쿼리를 보내는 함수에서 이를 호출하고 싶습니다.
일반 터미널에서 First: GQQ <<EOF
Second: <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 ...
더 안전합니다.