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]
?
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.
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
La façon dont cela fonctionne est simple:
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 &