web-dev-qa-db-fra.com

Lire une URL d'un fichier et l'ouvrir dans un onglet Firefox

PreTabs.txt est un fichier que j'ai sur mon bureau et qui ne contient que la ligne

google.com

Je veux diriger le contenu de ce fichier dans Firefox afin qu'il ouvre l'URL dans un nouvel onglet.

Si vous exécutez cat PreTabs.txt | firefox,
ne devrait-il pas être identique à firefox [Contents of PreTabs.txt]?

6
MibMoot

Piping n'est pas la même chose que passer un argument à un programme.

Si vous exécutez un programme, un processus est créé. Je simplifie ici, mais chaque processus a essentiellement une entrée et une sortie standard. Il reçoit une entrée via la norme in (peut-être) et produit une sortie à sa sortie standard (peut-être). Ce sont abrégé stdin et stdout respectivement.

Lorsque vous exécutez un programme dans le terminal, sa norme est ce que vous tapez dans le terminal pendant son exécution. Sa sortie standard est imprimée sur le terminal.

Lorsque vous exécutez a | b, vous exécutez a et b, mais en connectant la sortie standard du processus a au processus stdin du processus b. Autrement dit, si la sortie du processus a est créée, elle est entrée en entrée dans le processus de b, comme si vous deviez exécuter à la fois a et b dans des terminaux distincts et tout saisir Le processus de a imprime sur son terminal le terminal sur lequel vous exécutez b. Enfin presque. Vous pouvez uniquement créer du texte, par exemple, alors que les processus peuvent diriger des données arbitraires vers un processus différent.

Vous pouvez tester cela en canalisant les données vers tee.

Exemple:

echo foo | tee

echo lit ses arguments et les écrit sur sa sortie standard. Son stdout est connecté au stdin de tee. Tee lit simplement son stdin ligne par ligne et écrit ses entrées sur son stdout. Cela signifie que "foo" sera imprimé sur votre terminal car c'est la sortie standard du processus de tee.

echo foo | tee | tee | tee

A le même effet, bien sûr.

Vous pouvez aussi faire des choses plus utiles, ce qui est assez simple:

echo foo | sha256sum

Ceci calcule et imprime le sha256sum de "foo\n". Où \n est un saut de ligne parce que echo termine sa sortie par un saut de ligne, sinon l'exemple précédent n'aurait pas fonctionné car tee n'aurait pas vu un saut de ligne.

Votre commande cat PreTabs.txt | firefox exécute donc cat avec l'argument PreTabs.txt, ce qui oblige cat à écrire le contenu sur sa sortie standard. Ce stdout est le stdin de firefox ce qui signifie que firefox peut le lire. Ce n'est pas nécessaire et il n'y a pas de règle sur la façon dont cela devrait se comporter. On dirait qu'il ne le lit pas ou le lit puis l'ignore.

Si vous voulez passer un argument à un programme mais que cet argument se trouve à l'intérieur d'un fichier texte, vous pouvez utiliser des backticks. Les commandes entre backticks appariés sont exécutées à l'avance et leur sortie est collée à cet endroit de la commande externe.

Exemple:

echo bar > foo
echo `cat foo` > foobar

La première ligne écrit "bar" dans le fichier foo (écrase le contenu du fichier s'il existe déjà, sinon crée un nouveau fichier). Dans la deuxième ligne, cat foo est exécuté en premier. Il lit son paramètre foo et apprend qu'il est censé lire le contenu de foo et les imprimer sur sa sortie standard. Cette sortie est ensuite collée où

`cat foo`

est dans la deuxième ligne, donc la deuxième ligne devient

echo foo > foobar

qui écrit foo dans le fichier foobar.

Cela a pour effet que Firefox fait quelque chose:

echo "stackexchange.com" > foo
firefox `cat foo`

ouvre un nouvel onglet de chargement http://stackexchange.com dans Firefox.

Vous avez dit que dans votre cas, il charge le fichier dont il porte le nom en tant que paramètre et je ne me souviens en fait que vaguement de ce qu'il s'est comporté de la sorte dans le passé. C'est probablement une meilleure idée de dire explicitement ce qu'il faut faire:

echo "stackexchange.com" > foo
firefox -new-tab `cat foo`

Ceci est défini dans la page de manuel (man firefox) comme:

   -new-tab url
          Open url in a new tab.

bien que cela puisse être différent pour votre version de Firefox, bien sûr.

4
UTF-8

Assez facile à réaliser avec les commandes xargs et Nohup et & de bash. La commande exacte est la suivante:

xargs bash -c 'Nohup firefox $@ &' null  < tabs.txt 

Avec un fichier de tests comme celui-ci:

$ cat tabs.txt                                         
google.com
askubuntu.com
unix.stackexchange.com

enter image description here

La façon dont cela fonctionne est simple:

  • redirigez le fichier tabs.txt en tant que flux d'entrée vers xargs.
  • xargs traitera tous les éléments entrants comme des arguments et les transmettra à la commande bash -c ''. La chaîne null sert uniquement à définir l'argument $0. Il pourrait littéralement être n'importe quelle chaîne et n'est pas pertinent.
  • bash exécutera Nohup firefox $@ &, en substituant tous les arguments à la place de $@. Le résultat final est que nous obtenons d'ouvrir firefox et de le désavouer du processus de bash via Nohup et &
3
Sergiy Kolodyazhnyy