讓Linux軟件在單獨的Home文件夾下運行


開局一張圖,是不是立馬就開始難受起來了

為了盡量避免此類情況,我用了我生命中好多好多秒,寫了一個python腳本,用於在運行前自動設置一個用戶自己定義的文件夾作為主目錄,可以做到每個軟件都具有自己的主目錄。

介紹

先介紹一下這個腳本:

用法: ./runapp.py 可執行文件路徑 虛擬的home目錄(必須存在) [可執行程序的參數列表]
介紹:本程序用於將可執行文件通過修改環境變量的方式將其配置文件和Home目錄限制在一個固定的文件夾下,以達到純凈的目的。每次運行之前,本程序會自動將真正的主目錄下的所有非隱藏的文件以及文件夾軟鏈接至虛擬主目錄,以方便訪問。但是隱藏目錄將被忽略。
這將導致一些問題,請不要對包含此類功能的程序應用本程序:
1.需要操作配置文件(因為軟件擁有自己的主目錄,所以對於主目錄下配置的一切修改都無法於用戶環境生效)
2.需要輸出文件到主目錄的根目錄下(因為我們會將真正的主目錄下內容軟鏈接到虛擬主目錄,但是我們並不反向操作,因此程序若在主目錄下保存文件,您將無法直接在您的主目錄下找到它)
3.需要讀取主目錄下的資源數據文件(一般情況數據文件都存在隱藏文件夾中,如一些游戲,當你手動部署資源文件到隱藏文件夾后,程序將不能正確讀取,但是你可以手動部署至隱藏主目錄)

上邊這段文字會在腳本后不追加參數時顯示。

舉個例子

其中motrix_home文件夾必須存在,如果需要為軟件追加參數的話,可以直接在第三個參數的位置追加。

運行此命令后,Motrix將以motrix_home這個文件夾作為用戶主目錄,其生成的配置文件等也都會存在對應的目錄下,實現了與真正的主目錄隔離的效果。

目錄內容:

由於軟件很有可能有訪問用戶的各個文件夾的需要,所以,腳本中將自動把用戶主目錄里的所有未隱藏的內容軟鏈接到這個虛擬的主目錄下,這樣就方便了軟件的訪問。

同時,每次使用這個腳本時,腳本會自動檢測新的沒有被鏈接的文件或文件夾進行鏈接,也會自動刪除過期的鏈接。

下面是腳本的所有內容:

#!/bin/python3
#coding=utf-8
# 作者:Maicss
# 郵箱:maicss@126.com
# 更新時間:2021年5月22日
# 參數:可執行文件路徑,虛擬的home目錄(必須存在),[可執行程序的參數列表]
# 備注:本程序用於將可執行文件通過修改環境變量的方式將其配置文件和Home目
#      錄限制在一個固定的文件夾下,以達到純凈的目的。
# 缺點:可能無法及時更新軟鏈接
import os
import sys
argv = sys.argv 
if len(argv)<3 :
    print("用法: "+argv[0]+" 可執行文件路徑 虛擬的home目錄(必須存在) [可執行程序的參數列表]")
    print("介紹:本程序用於將可執行文件通過修改環境變量的方式將其配置文件和Home目錄限制在一個固定的文件夾下,以達到純凈的目的。")
    print("每次運行之前,本程序會自動將真正的主目錄下的所有非隱藏的文件以及文件夾軟鏈接至虛擬主目錄,以方便訪問。但是隱藏目錄將被忽略。")
    print("這將導致一些問題,請不要對包含此類功能的程序應用本程序:")
    print("\t1.需要操作配置文件(因為軟件擁有自己的主目錄,所以對於主目錄下配置的一切修改都無法於用戶環境生效)")
    print("\t2.需要輸出文件到主目錄的根目錄下(因為我們會將真正的主目錄下內容軟鏈接到虛擬主目錄,但是我們並不反向操作,因此程序若在主目錄下保存文件,您將無法直接在您的主目錄下找到它)")
    print("\t3.需要讀取主目錄下的資源數據文件(一般情況數據文件都存在隱藏文件夾中,如一些游戲,當你手動部署資源文件到隱藏文件夾后,程序將不能正確讀取,但是你可以手動部署至隱藏主目錄)")
    sys.exit(-1)
nowHome = os.getenv("HOME")
appPath = argv[1]
newHome = argv[2]
appArgv = argv[3:]
print("當前Home目錄:",nowHome)
print("虛擬的Home目錄:",newHome)
print("App的參數:",appArgv)

if not os.path.isdir(newHome):
    print ("您選中的虛擬主目錄不存在")
    sys.exit(-1)
if not os.path.isfile(appPath):
    print ("沒有找到",appPath)
    sys.exit(-1)
print("開始設置環境變量...")
env=os.environ
env["HOME"]=newHome
if os.getenv("HOME")==newHome:
    print("HOME...OK")
else:
    print("HOME...失敗")
    exit(-1)
cachePath=newHome+"/.cache"
cachePath = cachePath.replace("//","/")
if not os.path.exists(cachePath):
    os.mkdir(cachePath)
env["XDG_CACHE_HOME"]=cachePath
if os.getenv("XDG_CACHE_HOME")==cachePath and os.path.isdir(cachePath):
    print("XDG_CACHE_HOME...OK")
else:
    print("XDG_CACHE_HOME...失敗")
    exit(-1)
configPath=newHome+"/.config"
configPath = configPath.replace("//","/")
if not os.path.exists(configPath):
    os.mkdir(configPath)
env["XDG_CONFIG_HOME"]=configPath
if os.getenv("XDG_CONFIG_HOME")==configPath and os.path.isdir(configPath):
    print("XDG_CONFIG_HOME...OK")
else:
    print("XDG_CONFIG_HOME...失敗")
    exit(-1)
dataPath=newHome+"/.local/share"
dataPath=dataPath.replace("//","/")
if not os.path.exists(dataPath):
    os.makedirs(dataPath)

env["XDG_DATA_HOME"]=dataPath
if os.getenv("XDG_DATA_HOME")==dataPath and os.path.isdir(dataPath):
    print("XDG_DATA_HOME...OK")
else:
    print("XDG_DATA_HOME...失敗")
    exit(-1)

print("更新常用目錄軟鏈接...")
donotln = [".config",".local",".cache"]
inHome = os.listdir(nowHome)
inNewHome = os.listdir(newHome)
for dir in inNewHome:
    if os.path.islink(newHome+"/"+dir):
        if not os.path.exists(os.readlink(newHome+"/"+dir)):
            os.remove(newHome+"/"+dir)
for dir in inHome:
    if dir not in donotln and dir[:1]!="." and not os.path.exists(newHome+"/"+dir):
        print("link:"+dir)
        os.symlink(nowHome+"/"+dir,newHome+"/"+dir)
str_argv=""
for arg in appArgv:
    str_argv+=" "+arg

exitCode = os.system(appPath+str_argv)
print("程序運行結束:",exitCode)
exit(exitCode)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM