이 쉘 파이프를 사용하여 터미널을 통해 SQL 덤프를 가져옵니다.
$ cd var/lib/mysql && mysqldump -uroot -p"craft" --add-drop-table craft > ~/../docker-entrypoint-initdb.d/base.sql && cd ~/..
보시다시피 var/lib/mysql
디렉터리로 가서 파일로 덤프를 만든 다음 원래 위치에서 돌아왔습니다.
명령은 정확하지만 디렉토리로 직접 이동하지 않는 것처럼 더 간결하게 작성할 수 있을 것 같습니다 var/lib/mysql
.
누구든지 조언을 해줄 수 있나요?
답변1
솔직히 말해서 둘 다 전화할 이유가 전혀 없습니다 cd
.
cd
입력한 디렉토리에 대해 아무 작업도 수행 하지 않는 것 같습니다 . 데이터베이스 덤프 위치에 대한 절대 경로를 제공합니다. 사용자 정의 MySQL 구성 파일이 필요한 경우 어쨌든 사용자의 홈 디렉터리에서 얻을 수 있습니다.
따라서 아마도 다음을 사용하게 될 것입니다.
mysqldump -uroot -p"craft" --add-drop-table craft \
> ~/../docker-entrypoint-initdb.d/base.sql
어떤 디렉터리에서 실행하든 상관없습니다.
답변2
이 경우 작업 디렉토리를 전혀 변경할 필요가 없습니다(Kusalananda의 답변처럼). 그러나 명령을 처리하는 경우하다특정 작업 디렉토리가 필요한 경우 이를 더 쉽게 만들 수 있도록 알아두어야 할 몇 가지 사항이 있습니다.
첫째, 변수가 cd
set 이므로 OLDPWD
이름을 모르더라도 이를 사용하여 원래 디렉터리로 돌아갈 수 있습니다. 둘째, 명령이 성공했는지 여부를 반환하고 싶으므로 ;
대신 사용하세요 &&
.
cd "$workdir" && somecommand ; cd "$OLDPWD"
첫 번째가 실패하더라도 cd
더 강해지는 것은 여전히 신뢰할 수 없습니다.
if cd "$workdir" ; then somecommand ; cd "$OLDPWD" ; fi
somecommand
이 시점에서도 이후에 종료 상태가 필요하면 어려움을 겪게 됩니다.
일반적으로 하위 쉘에서 명령을 실행하고 하위 쉘의 작업 디렉터리만 변경하는 것이 가장 좋습니다.
( cd "$workdir" && somecommand )
마지막 방법은 후속 명령에 대한 변수 설정과 같이 서브셸에서 수행할 수 없는 작업을 수행하지 않는 한 일반적으로 사용하고 권장하는 방법입니다.