如何讓“realpath”找到我的符號連結?
我在 MacOSX 上使用
bash
我的 shell。我有符號連結,創建如下:ln -s /usr/bin/python python2
我有一個使用 python2 的包,我想在我目前的工作目錄中創建一個符號連結,
/usr/bin/python
它實際上是 python2。當我python2
從命令行執行時,我收到此錯誤:python2: realpath couldn't resolve "/usr/bin/python2"
但是像這樣呼叫它
./python2
可以正確解析路徑。我的PATH
有.
。事實上,為了測試,我修改了它,只包含.
在它裡面。我該如何解決這個問題?謝謝!
語境
以下一些建議的解決方案對我不起作用。我試圖盡可能集中和簡短地提煉我的問題,以免人們淹沒在文本的海洋中,但顯然我需要提供更多背景資訊。
我正在嘗試在我從 git 複製的包上進行開發。原始包
git-multimail
是/是在 Linux 的某些變體上開發的(我猜是 Ubuntu)。**我一直在嘗試對其進行修改,以便能夠在 MacOSX 上使用它及其測試套件,並且盡可能少地進行修改。**這就是為什麼一些建議的解決方案並不理想的原因:
- **
python2
以 root身份在 /usr/bin/ 中創建一個符號連結。**我正在尋找一個不需要這個的解決方案。一開始這是一個明顯的選擇,但我想要一個盡可能少地修改主機系統的解決方案。這就是為什麼我想在目前工作目錄中創建一個臨時符號連結,將 CWD(即.
)添加到我的路徑中,然後在完成後銷毀它(即符號連結)。- **創建一個包裝腳本以使用現有的 python 呼叫 python 腳本。**這樣做的問題是,大部分測試套件都使用實際的 script_files 作為執行檔,這取決於 shebang 來找到正確的執行環境。這將意味著大量編輯測試套件。在這種情況下,(請參閱下面的測試框架片段),我必須為每個
.py
文件添加一個包裝器;此外,使用者/開發人員必須了解使用包的不同規則,具體取決於它們所在的系統(即在 MacOSX 上,確保在不通過包裝器或顯式呼叫的情況下不使用 python 文件/usr/bin/python file.py
)。#! /bin/sh D=$(cd $(dirname "$0") && pwd) MULTIMAIL="$D/../git-multimail/git_multimail.py" POST_RECEIVE="$D/../git-multimail/post-receive" TESTREPO=$("$D/create-test-repo") HOME="$D" XDG_CONFIG_HOME="$D" GIT_CONFIG_NOSYSTEM=1 export HOME XDG_CONFIG_HOME GIT_CONFIG_NOSYSTEM cd $TESTREPO test_email() { REFNAME="$1" OLDREV="$2" NEWREV="$3" echo "$OLDREV" "$NEWREV" "$REFNAME" | USER=pushuser "$MULTIMAIL" }
- 將所有
python2
引用更改為python
. 自述文件建議了這一點,但這實際上使版本控制變得無用,因為系統將更改視為新版本,而實際上它不是(語義上)。我一直在使用(3),但我正在嘗試找到更好的解決方案。我願意接受這就是事情的本來面目(即,沒有合適的方式將“python2”指向
/usr/bin/python
它是可移植且不引人注目的,無需對測試套件和實際框架進行大量更改)。
我相信您與 Apple 用於管理和在同一程序的多個版本之間切換的系統發生衝突。您可以使用以下名為的腳本完成您想要的,不太優雅但沒有問題
python2
:#!/bin/bash exec /usr/bin/python "$@"
讓它可執行 (
chmod +x python2
),然後你就開始做生意了。問題說明:
當您執行時,它會在同一目錄中
/usr/bin/python
查找並執行。您的符號連結失敗,因為系統遵循符號連結到,然後查找並找不到那裡。您可以通過使用“硬連結”而不是符號連結更進一步:python2.7
/usr/bin
python2
rm python2 ln /usr/bin/python python2
現在沒有符號連結可循,只有同一個文件(inode)的兩個文件名。但現在我失敗了以下消息:
python2: posix_spawn: /Users/alexis/.../python22.7: No such file or directory
請注意
python22.7
:框架正在添加2.7
到您創建的名稱中!與其試圖解開這個問題並建立一個符合其期望的連結森林,我建議您**遠離版本管理框架,**並使用上面建議的解決方案。PS。可能有更好的解決方案:如果您要解釋開始時需要做什麼(為什麼需要提供
python2
的別名python
),那麼有人可能會以不同的方式幫助您。這在 stackexchange 術語中被稱為“XY 問題”……
嘗試:
ln -s /System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7 /usr/local/bin/python2