Le Alternative in Linux

Come faccio ad esempio di fare un comando che funzioni su diversi tipi di Linux che hanno diversi comandi in quel caso?

 

Esempio richiamo un editor per modificare un file di configurazione, ma ogni distribuzione Linux e anzi ogni DE/WM dispone di editor diversi e ogni utente poi preferisce un editor suo; Dovrei ricercare su quella macchina Linux che editor utilizza e poi scegliere, cosa ancora più complicata se lo riferisco ad un utente!

 

Oppure altro esempio voglio che un programma sia eseguito come (root) super-utente ​​ con una bel sistema d’introduzione della stessa? Esistono molte!

 

Dispongo poi di diverse versioni dello stesso programma, vedi Java, e vorrei collegare solo una sua versione?

 

In Linux hanno sviluppato diversi modi, esempio il gruppo XDG creò diversi script che se eseguiti convertono nei rispettivi comandi. Alias che crea una alias ovvero un altro nome che richiama il vero nome del programma oppure ​​ Update-alternative che è per i casi più difficili da trattare.

 

 

 

XDG

 

In XDG usa degli script dove è descritto da codice cosa deve fare. Non è propriamente “Alternative” ma è definito tale.

​​ 

Esempio

 

xdg-su -e xterm

 

Vede che WM/DE usi e quindi richiama il sistema d’introduzione password suo (se non si usa un WM/DE o è sconosciuto usa il terminale) e quindi esegue il programma xterm come Root.

Ecco i vari comandi:

 

Esiste

Comando

Cosa richiama

X

xdg- email

Il lettore email. Scrive una nuova email nel client di posta preferito dell'utente.

X

xdg-su

Il sistema d’accesso root

X

xdg-desktop-menu

Installa gli elementi del menu del desktop

X

xdg-desktop-icon

Installa le icone sul desktop dell'utente

 

xdg-edit

L’editor testo predefinito

X

xdg-icon-resource

Installa risorse icona

X

xdg-mime

Query e installa tipi e associazioni MIME

X

xdg-open

Apre un URL nell'applicazione preferita dell'utente che gestisce il rispettivo URL o tipo di file

X

xdg-screensaver

Abilita, disabilita o sospende lo screensaver predefinito

X

xdg-settings

Ottieni o imposta il browser web predefinito e i gestori di URL

 

xdg-off

Esegue lo spegnimento o riavvio della macchina.

 

xdg-x

Esegue l’avvio dell’ambiente grafico. Sostituito da “startx”.

 

Nota: nella colonna “Esiste”, la “X” indica che esiste nel pacchetto “xdg-util”.

I singoli comandi sono descritti nel manuale Linux (in inglese).

https://www.freedesktop.org/wiki/Software/xdg-utils/

 

Alias

 

Alias è un comando potente, permette di definire un nome ad una riga di comando.

Esempio vogliamo richiamare un editor?

alias editor='mcedit'

 

adesso basterà digitare “editor” per richiamare direttamente il programma mcedit che è un particolare editor di mc.

Attenzione: Gli alias vengono memorizzati nella RAM e all'arresto dell'elaboratore non vengono salvati sulle memorie di massa. Per rendere permanenti gli alias è possibile utilizzare dei particolari file batch che vengono eseguiti all'apertura della shell.

 

 

Update-alternative

 

Una bella idea arrivata da Debian è Update-alternative.

È possibile che in un dato momento nel sistema siano installati più programmi che hanno la  ​​ ​​ ​​ ​​ ​​​​ stessa funzione o una funzione simile. Per esempio, molti sistemi hanno diversi editor ​​ di testo ​​ installati contemporaneamente. Questo dà agli utenti del sistema una possibilità di scelta, permettendo a ciascuno di usare un ​​ editor ​​ diverso, ​​ se ​​ lo ​​ desidera, ​​ ma ​​ rende difficile ​​ per ​​ un ​​ programma ​​ fare ​​ una ​​ buona ​​ scelta ​​ quando deve invocare un editor se l'utente non ha impostato una preferenza specifica.

Dunque creare un link alla applicazione che detiene un nome proprio.

Per vedere quante Alternative ci sono digitate:

ls -al /etc/alternatives/

Dice che permessi ci sono “lrwxrwxrwx”, che utente “root root”, in che data/ora è stato creato, nome che è un link e dove punta quel link.

Potete vedere che non esiste “edit” e difficilmente “xsu” che di solito sono di base sulle installazioni Debian derivate.

Edit richiama l’editor e l’altro (più difficilmente in quanto si usa abitualmente xdg-su) xsu fa quello che fa xdg-su ma con una sua box.

Per essere sicuri basta diventare root e digitare:

update-alternatives --display edit

 

se non esiste vi dirà :

update-alternatives: errore: nessuna alternativa per edit”

Nota: Il “comando” si trova in /usr/sbin/update-alternatives .

La prima domanda, scommetto, come aggiungere “edit” (ed usare l’editor “vi” che in realtà si chiama “/usr/bin/vim-nox11”).

Questo è il formato:

alternative [ opzioni ] --install collegamento_prioritario nome_principale nome_del_percorso valore_priorità[ --slave collegamento nome percorso ] ... [ --initscript servizio ]

Noi interessa solo:

alternative [ opzioni ] --install collegamento_prioritario nome_principale nome_del_percorso ​​ valore_priorità

Nota: update-alternative funziona solo come root e qui metterò il comando sudo per farvi capire questo.

Dunque:

sudo update-alternatives --install /usr/bin/edit edit /usr/bin/vim-nox11 400

Quindi qui gli dico di metterlo come un comando principale (“/usr/bin” è il posto giusto per i comandi principali), tramite la stringa “/usr/bin/edit” che sarà creato come link, ovvero, sarà creato un file link in “/usr/bin” con il nome “edit”.

Questo link punterà sulla cartella “/etc/alternatives/(è la cartella che raccogli tutti gli Alternative) dove ci sarà il file edit (che può essere un link, una shell o programma) infatti poi gli dico che deve chiamarsi “edit” con la parte del comando “edit”

Poi dove si trova il comando che voglio usare (dove punterà il file-link edit nel nostro caso), ovvero in/usr/bin/mcedit”.

Nota: In realtà il file edit è un file-multi-link ma non complichiamoci la vita per adesso e vedi sotto.

 

Ed infine che priorità se ci sono altri “edit” definiti con alternative, deve avere in questo caso il valore 400 (se trova priorità uguale si arrabbia, se 0 è il principale).

Eseguito il comando lui risponderà:

update-alternatives: viene usato /usr/bin/edit per fornire /usr/bin/vim-nox11 (edit) in modalità automatica

 

Adesso se digitate edit dovrebbe uscire “vi”.

Riepilogando tutto questo giro in giro:

Voi digitate

edit pippo.txt

 

Quindi “Linux” cerca il comando “edit” e lo trova in “/usr/bin/edit”. Però è un file-link e quindi va in “/etc/alternatives/” dove trova finalmente il file “edit” (file-multi-link), ma questo contiene diversi link, e quello più basso (del valore 400) punta verso “/usr/bin/vim-nox11”, quindi esegue “vim-nox11”, per la precisione “vim-nox11 pippo.txt”.

Logico che se poi mettiamo un altro con il valore_priorità 300 (esempio Nano), quando diamo come comando edit invece di eseguire vim-nox11 esegue Nano, infatti il numero più basso è più diventa prioritario.

Se poi abbiamo sbagliato e quindi dobbiamo cancellarlo:

sudo update-alternatives --remove edit /usr/bin/nano

In questo caso diciamo di rimuovere dalla “voce edit” il link /usr/bin/nano che avevamo dato il valore_priorità 300. Con l’opzione “--remove-all” (al posto di --remove) cancelleremo tutto di quella voce.

Le altre sono:

update-alternatives [options] --install link name path priority [--slave link name path]... [--initscript service]

 

update-alternatives [options] --remove name path

update-alternatives [options] --set name path

update-alternatives [options] --auto name

update-alternatives [options] --display name

update-alternatives [options] --config name

 

Quando si usa l'opzione --config, update-alternatives elenca tutte le scelte per il gruppo di collegamenti di cui il nome specificato ​​ è ​​ il ​​ nome dell'alternativa ​​ principale. ​​ La scelta attuale viene contrassegnata da un «*». Verrà quindi chiesto all'utente di fare una scelta per ciò che riguarda questo gruppo di collegamenti. A seconda della ​​ scelta ​​ fatta, il ​​ gruppo di collegamenti potrebbe non essere più in modalità automatica. Sarà necessario usare l'opzione --auto per ritornare alla modalità automatica (oppure ​​ si ​​ può rieseguire --config e selezionare la voce contrassegnata come automatica). Se esiste un unica voce però vi dirà (esempio il Java) :

È presente una sola alternativa nel gruppo java (che fornisce /usr/bin/java): /usr/lib64/jvm/jre-10-openjdk/bin/java - Nulla da configurare.

 

Per un uso estensivo ecco la guida:

http://manpages.ubuntu.com/manpages/trusty/it/man8/update-alternatives.8.html

-Java

 

Nota: Con il 8 di Java (1.8) abbiamo un suo sistema che fa meno delle Alternative, questo per uniformarlo meglio sui fari OS.

Curiosità: Su OpenSUSE viene usato estensivamente per Java, in quanto possono esistere varie versioni di JVM e di JDK di Java. Per base l’ultima versione di Java ottiene il valore più basso, ma con l’opzione “--config” possiamo cambiarlo.

Il link è in:

/etc/alternatives/java

 

Esempio:

sudo /usr/sbin/update-alternatives --display java

java - auto mode

 ​​​​ link currently points to /usr/lib64/jvm/jre-1.7.0-openjdk/bin/java

/usr/lib64/jdk_Oracle/bin/java - priority 3

 ​​​​ slave java.1.gz: /usr/lib64/jdk_Oracle/man/man1/java.1.gz

 ​​​​ slave jre: /usr/lib64/jdk_Oracle/jre

 ​​​​ ...

 ​​​​ slave tnameserv: /usr/lib64/jdk_Oracle/bin/tnameserv

 ​​​​ slave tnameserv.1.gz: /usr/lib64/jdk_Oracle/man/man1/tnameserv.1.gz

/usr/lib64/jvm/jre-1.7.0-openjdk/bin/java - priority 17147

 ​​​​ slave java.1.gz: /usr/share/man/man1/java-java-1.7.0-openjdk.1.gz

 ​​​​ slave jre: /usr/lib64/jvm/jre-1.7.0-openjdk

 ​​​​ ...

 ​​​​ slave tnameserv: /usr/lib64/jvm/jre-1.7.0-openjdk/bin/tnameserv

 ​​​​ slave tnameserv.1.gz: /usr/share/man/man1/tnameserv-java-1.7.0-openjdk.1.gz

Current 'best' version is '/usr/lib64/jvm/jre-1.7.0-openjdk/bin/java'.

 

 ​​ ​​ ​​ ​​​​ 

Come potete vedere, con priorità 3 abbiamo “jre-1.7.0-openjdk/bin/java” che è collegata (come “schiavo”) al /usr/lib64/jdk_Oracle/jre e al Man (pagine di manuale) “usr/lib64/jdk_Oracle/man/man1/java.1.gz”.

--Settare le alternative Java

sudo update-alternatives --config java

There are 2 choices for the alternative java (providing /usr/bin/java).

 

 ​​​​ Selection  ​​ ​​​​ Path  ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ Priority  ​​​​ Status

------------------------------------------------------------

* 0  ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ /usr/lib64/jvm/jre-1.7.0-openjdk/bin/java  ​​​​ 17147  ​​ ​​ ​​​​ auto mode

 ​​​​ 1  ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ /usr/lib64/jdk_Oracle/bin/java  ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ 3  ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ manual mode

 ​​​​ 2  ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ /usr/lib64/jvm/jre-1.7.0-openjdk/bin/java  ​​​​ 17147  ​​ ​​ ​​​​ manual mode

 

Press enter to keep the current choice[*], or type selection number:

 

L'asterisco indica la scelta corrente, se si digita 1 dell’esempio, dopo i due punti si ottiene:

Press enter to keep the current choice[*], or type selection number: 1  ​​​​ 

update-alternatives: using /usr/lib64/jdk_Oracle/bin/java to provide /usr/bin/java (java) in manual mode.

 

Quindi quella diventa la voce/versione principale Java.

 

Con YAST

 

Con OpenSUSE 15 (ma anche prima) abbiamo anche come gestire le Alternative tramite Yast, se non lo trovate scaricate:

yast2-alternatives

 

Qui abbiamo un sistema completo e facile per settare quello che vogliamo infatti basta cliccare su “Modifica” ​​ per settare di tutto

Per maggiori informazioni basta sapere come fare nel sistema manuale.

 

Ciaooooooooooooooooooo

Precedente DraftSight su OpenSUSE Successivo Syncthing in OpenSUSE