
지난 5년 동안 저는 과학 컴퓨팅을 수행하기 위한 일상적인 운영 체제로 Linux를 사용해 왔습니다. 내 직업은 최근에 Mac을 제공했으며 앞으로 몇 달 동안 기본 사용자가 될 것입니다. Mac의 Free-BSD bash 환경과 익숙한 GNU 환경 사이에서 계속 충돌이 발생합니다. 두 환경 모두 제가 설정한 bash 스크립트와 bash 명령( coreutils
, findutils
등)을 실행하려고 할 때 발생합니다. HPC뿐만 아니라 다른 모든 컴퓨터가 Linux와 GNU 유틸리티를 사용하기 때문에 Free-BSD 유틸리티로 완전히 전환하고 싶지 않습니다. 나는 두 개의 bash 스크립트 세트를 유지하고 두 시스템 간의 서로 다른 플래그와 기능의 미묘한 차이를 기억해야 하는 것을 피하고 싶습니다. 또한 다른 사용자가 사용할 Mac GUI 유틸리티 등을 손상시키고 싶지 않습니다(향후 몇 달 내로 또는 다른 사용자에게 제공할 때). 추가적으로 다음 사항에 응답하세요.이것관련 문제에서는 Mac Free-BSD 유틸리티를 GNU 유틸리티로 완전히 교체하지 말라고 경고합니다.
시스템 Free-BSD 유틸리티를 유지하면서 GNU 유틸리티만 사용하도록 별도의 bash 환경을 설치/설정할 수 있습니까? 내가 기대하는 가장 유망한 옵션은 $PATH
Free-BSD 실행 파일을 무시하면서 GNU 실행 파일(및 해당 정규화된 이름)이 포함된 디렉터리를 가리키도록 변수를 설정하는 것입니다. 이것을 크로스 플랫폼 bash 스크립트에 어떻게 적용할 수 있나요? 고려해 볼 만한 다른 옵션이 있나요?
답변1
우선, 이것은 단지coreutils
. BSD에 해당암소 비슷한 일종의 영양findutils
도매우 다르다, 거의 모든 명령은 다음과 연관되어 있습니다.동적 연결등등이 다릅니다.
게다가 버전 차이도 처리해야 합니다. OS 이것자동 도구또한 주요 Linux 배포판에 비해 오래된 경우가 많습니다.
질문의 핵심 부분에 대한 대답은 다음과 같습니다. "물론입니다. 사용할 수 있는 이유는 무엇입니까?"스스로 만든이러한 대체 GNU 도구를 모두 설치하려면 파일에 $(brew --prefix coreutils)/libexec/gnubin
및 첫 번째 도구를 넣어 해당 도구가 먼저 발견되는지 확인하십시오./usr/local/bin
PATH
export PATH="$(brew --prefix coreutils)/libexec/gnubin:/usr/local/bin:$PATH"
어떤 이유로 패키지가 다른 위치에 설치된 경우 해당 내용 도 변수 brew
에 포함하십시오 .PATH
몇 개의 패키지만 교체하려는 경우 까다로운 부분은 모든 이름 변경을 처리하는 것입니다. brew
GNU를 설치할 때와 같이 핵심 운영 체제에 이미 구현된 프로그램을 설치할 때 마다 coreutils
해당 버전의 이름을 다르게 지정하므로 당시 필요에 따라 해당 프로그램 중 하나를 실행할 수 있습니다. 이러한 모든 심볼릭 링크의 이름을 바꾸는 대신 1 이러한 모든 문제를 해결하기 위해 간접 계층을 사용하는 것이 좋습니다.
$ mkdir ~/linux
$ cd ~/linux
$ ln -s /usr/local/bin/gmv mv
...etc for all the other tools you want to rename to cover OS versions
$ export PATH=$HOME/linux:$PATH
...try it out...
새로운 환경에 익숙해지면 을 export PATH=$HOME/linux:$PATH
(를) 이동할 수 있습니다 ~/.bash_profile
.
이는 일괄 교체이든 단일 애플리케이션 교체이든 대화형 사용을 처리합니다.
안타깝게도 쉘 스크립트 문제가 완전히 해결되지는 않습니다. 예를 들어 쉘 스크립트가 자체 환경을 가져오는 경우가 있기 때문입니다 cron
. 이 경우 PATH
각 크로스 플랫폼 쉘 스크립트의 상단을 수정할 수 있습니다.
#!/bin/bash
export PATH="$HOME/linux:$(brew --prefix coreutils)/libexec/gnubin:/usr/local/bin:$PATH"
이를 조건으로 설정할 필요는 없습니다. 단지 쉘에 프로그램을 찾을 수 있는 또 다른 장소를 제공하기 때문입니다.
각주
- 예를 들어
/usr/local/bin/gmv
→../Cellar/coreutils/$version/bin/gmv
관련 기사
답변2
VM 상자나 이중 부팅을 사용하지 않고 freebsd를 사용하여 기본적으로 GNU를 실행할 수 없는 경우 이 답변을 시도해 볼 수 있는 방법으로 여기에 넣습니다.
언급한 대로 homebrew는 모든 GNU coreutil을 설치할 수 없습니다. 제가 틀렸다면 정정해 주세요. 하지만 모든 파일을 한 곳(하나의 컴퓨터)에 보관할 수도 있기를 원할 것입니다.
인터넷에 연결된 보조 컴퓨터(예: Raspberry Pi?)가 있는 경우 Mac에서 Linux 상자에 SSH로 연결할 수 있습니다. 또는 X 환경을 사용하려는 경우 컴퓨터 Linux 컴퓨터에서 x11vnc를 사용할 수 있습니다. 사과.
SSH를 사용하는 경우 로그인 셸에만 액세스할 수 있다는 점을 기억하세요.
SSH 서버 및 클라이언트를 만드는 방법
먼저 openssh 서버가 Linux 시스템에서 실행되고 있는지 확인하십시오.
$ service ssh status
서비스가 실행되면 다음과 같은 출력이 표시됩니다.
ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2015-07-17 16:51:08 NPT; 5h 21min ago
Process: 1669 ExecReload=/bin/kill -HUP $MAINPID (code=exited, status=0/SUCCESS)
Main PID: 615 (sshd)
CGroup: /system.slice/ssh.service
└─615 /usr/sbin/sshd -D
서비스가 실행되고 있지 않으면 먼저 openssh가 설치되어 있는지 확인하세요.
sudo apt-get install openssh
그럼 서비스 시작
sudo service ssh start
모든 것이 완료되었습니다! (물론 키를 생성하고 싶지 않은 경우)
이제 SSH를 통해 Linux 시스템에 로그인할 수 있습니다.
ssh <USERNAME_ON_LINUX_MECHINE>@<LINUX_HOST_NAME>
Linux 호스트 이름은 기본적으로 시스템의 외부 IP 주소입니다.
(물론, Mac에도 openssh를 설치해야 합니다)
SSH 터널링에 대한 전체 튜토리얼은 다음과 같습니다.
http://inside.mines.edu/fs_home/gmurray/HowTo/sshNotes.html
x11vnc 서버 및 클라이언트 사용 방법
나는 vnc가 SSH의 더 나은 형태라고 생각한다. (내 개인적인 의견) VNC는 SSH보다 설치하기 쉽다
다음은 vnc 설정을 위한 Arch-wiki 링크입니다. https://wiki.archlinux.org/index.php/X11vnc
x11vnc 설치
sudo apt-get install x11vnc
사용자의 비밀번호를 만드세요:
x11vnc -storepasswd
SSH 설정이 있는 경우 로그인한 경우 이를 사용하여 x11vnc를 시작할 수 있지만 비밀번호 파일을 사용하도록 지시해야 합니다.
x11vnc -usepw
lightdm을 사용하여 로그인한다고 가정하면 다음을 사용하여 x11vnc를 시작하여 이 문제를 해결할 수 있습니다.
sudo x11vnc -xkb -noxrecord -noxfixes -noxdamage -display :0 -auth /var/run/lightdm/root/:0 -usepw