Puncte:3

Cum găsesc pachetul care oferă un alias?

drapel bn

Folosind apt-file Sunt capabil să găsesc pachetele care oferă anumite executabile, de exemplu:

sudo apt-file search {/bin,/sbin,/usr/bin/,/usr/sbin}/wget

Pai, de fapt:

sudo apt-file search {/bin,/sbin,/usr/bin/,/usr/sbin}/wget | grep "/wget$"

(Pentru că altfel ar returna toate pachetele care conțin executabile care încep cu wget.)

Acum alergam:

EXEC_NAME="x86_64-w64-mingw32-g++"
sudo apt-file search {/bin,/sbin,/usr/bin/,/usr/sbin}/${EXEC_NAME} | grep „${EXEC_NAME}$”

Și, în mod surprinzător, nu returnează nimic. De ce? Pentru că niciun pachet nu oferă un fișier cu acest nume.

Daca alerg:

EXEC_NAME="x86_64-w64-mingw32-g++"
sudo apt-file search {/bin,/sbin,/usr/bin/,/usr/sbin}/${EXEC_NAME}

Am urmatorul rezultat:

g++-mingw-w64-x86-64-posix: /usr/bin/x86_64-w64-mingw32-g++-posix
g++-mingw-w64-x86-64-win32: /usr/bin/x86_64-w64-mingw32-g++-win32

ceea ce înseamnă că nu există niciun pachet de furnizare x86_64-w64-mingw32-g++.

Dar după un timp am găsit asta g++-mingw-w64-x86-64-posix nu oferă doar executabilul g++-mingw-w64-x86-64-posix, dar și un alias sau un link simbolic numit g++-mingw-w64-x86-64.

În acest caz, a fost ușor de înțeles, deoarece pachetul s-a întâmplat să conțină un alt binar cu un nume foarte asemănător. Acum problema mea este că trebuie să automatizez acest lucru într-un mod care să funcționeze pentru orice alias/link simbolic, chiar și pentru cele care au un nume complet diferit.

Cum pot face acest lucru?

Editați | ×:

Aliasul este creat în fișier g++-mingw-w64-x86-64-posix.postinst al g++-mingw-w64-x86-64-posix pachet, în cazul în care vă ajută:

update-alternatives --install /usr/bin/x86_64-w64-mingw32-g++ x86_64-w64-mingw32-g++ /usr/bin/x86_64-w64-mingw32-g++-posix 30 \
  --slave /usr/bin/x86_64-w64-mingw32-c++ x86_64-w64-mingw32-c++ /usr/bin/x86_64-w64-mingw32-c++-posix

Edit 2: Există o modalitate de a căuta conținutul fișierului din toate pachetele? .postinst fisiere? Poate prin descărcarea tuturor .postinst fișiere într-un cache? Poate că asta ar putea fi făcut prin descărcarea antetului de fișier al fiecărui pachet pentru a vedea la ce octeți din arhive se află fișierele .postinst și apoi folosiți cererile de interval HTTP pentru a le descărca?

Edit3:

Acest lucru nu schimbă nimic, dar am găsit în loc de grep și cut, puteți doar să utilizați -X si -l steag. Acest lucru face comanda un pic mai scurtă:

sudo apt-file search -l -x "^/(bin|sbin|usr/bin|usr/sbin)/${EXEC_NAME}$" | cap -1
mook765 avatar
drapel cn
Aruncă o privire atentă la comanda ta grep `grep "${EXEC_NAME}$"`. Cel de-al doilea semn dolar este vinovatul.
N0rbert avatar
drapel zw
Presupun că suferi de caracteristica modernă a linkurilor simbolice. Consultați [Întrebări și răspunsuri](https://askubuntu.com/a/1313596/66509) despre o problemă similară cu `dpkg -S`. Într-adevăr, vorbești despre *alternativă*, care nu este chiar un *alias*.
Forivin avatar
drapel bn
@mook765 Cum ar fi acel al doilea semn de dolar de vină? Eliminarea acestuia ar cauza și mai multe probleme, așa cum este explicat în întrebare.
sudodus avatar
drapel jp
Se pare că este suficient să cunoaștem începutul numelui. Puteți încerca cu următoarea linie de comandă: `apt-file search {/bin,/sbin,/usr/bin/,/usr/sbin}/name`; Nu aveți nevoie de „sudo” pentru această comandă.
Forivin avatar
drapel bn
Nu, asta nu este suficient. Va returna toate pachetele care conțin un binar care începe cu acel nume. Practică foarte proastă, extrem de nesigură și ar trebui evitată cu orice preț într-un script bash.
sudodus avatar
drapel jp
Am crezut că l-ați folosit pentru a găsi pachetul de programe relevant, deci practic o operație manuală susținută de o linie de comandă mică. Nu-mi este clar ce vrei. Te rog explica.
Forivin avatar
drapel bn
Am nevoie de cod care ia numele unui executabil/alias/... ca intrare și returnează numele pachetului care l-ar instala.
sudodus avatar
drapel jp
Dacă executabilul este o legătură simbolică, este posibil să trebuiască să urmați linkul (legăturile) până când găsiți fișierul executabil real și apoi cred că `căutarea fișierului apt /full/path/filename` va funcționa. O pot face manual, dar ar fi nevoie de ceva programare pentru a o face într-un shellscript. De exemplu, am `rename`: /usr/bin/rename -> /etc/alternatives/rename -> /usr/bin/file-rename (care este scriptul perl al lui Larry Wall).
Forivin avatar
drapel bn
Acest lucru nu ar funcționa deoarece linkul simbolic este creat de scriptul postinst. Nu este un fișier conținut în pachet.
muru avatar
drapel us
Cred că sistemul de alternative (`update-alternatives`) este gestionat aproape exclusiv prin intermediul scripturilor de întreținere, astfel încât aceste informații nu sunt capturate într-o bază de date ușor de căutat.
James S. avatar
drapel de
Un alias nu este o legătură simbolică, iar o legătură simbolică nu este un alias. Nomenclatura este importantă pentru a preveni confuzia.
Puncte:1
drapel cn

Problema cu linkurile simbolice este că acestea nu sunt neapărat instalate de pachete.

Poți să folosești readlink -f [/cale/fișier] pentru a (încerca să) obține calea către fișierul real. Dacă /cale/fișier este o legătură simbolică, readlink va returna fișierul către care indică legătura simbolică. Dacă există un lanț de legături simbolice, readlink le va urma până când se ajunge la o rupere în lanț sau fișierul real.

Apoi poți folosi apt-file pentru a căuta pachetele.

Puncte:1
drapel it

Dacă descărcați dwww cu comanda

sudo apt install dwww

poți folosi dwww-quickfind, unul dintre sub-pachetele sale, pentru a-l găsi rapid. Următoarele sunt din pagina de manual dwww:

dwww-quickfind(8)

        Folosit de dwww-find(8) pentru a găsi rapid care
        pachetul căruia îi aparține un program.

Doar pentru a testa interfața, din terminal, a rulat-o pentru 10 - 15 comenzi, unele GNU, altele nu, fără probleme. De exemplu, când am alergat

:~$ dwww-quickfind om

iar rezultatul a fost

om-db
VIRTUAL: man-db

În mod evident, urmează link-uri simbolice, așa că aș ghici că urmărește și aliasuri. Oricum, merită încercat.Chiar dacă nu se întâmplă, doar primesc dwww merita osteneala. Tip dwww <orice-pachet> si vei intelege.

Este ca om comanda pe steroizi.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.