Cela marche:
$ echo "notifier-envoyer BONJOUR" | maintenant
Cela ne veut pas:
$ at now <echo "notify-send HELLO"
Il dit "fichier ou répertoire introuvable".
Je comprends qu'il y a une -f
option à cette commande, avec laquelle je peux fournir le fichier à exécuter à un moment donné.
Donc, cela m'a fait réfléchir ... en général, comment savoir pour quel paramètre les opérateurs de redirection fournissent la valeur?
command-line
bash
vlad-ardelean
la source
la source
foo | bar
et que vousbar < foo
êtes équivalent. Ils ne sont pas.Réponses:
Vous utilisez deux choses différentes ici et devriez en utiliser une troisième. Voyons voir:
|
: Ceci est l' opérateur de tuyau , il sert à passer la sortie d'un processus en entrée à un autre:Cela exécute le programme
foo
et transmet sa sortie en entrée au programmebar
.>
,<
,>>
Et<<
: Ce sont les opérateurs de redirection , ils servent à envoyer des données à / de fichiers :foo > bar
: exécute le programmefoo
et enregistre sa sortie dans le fichierbar
, écrase 1 son contenu et le crée s'il n'existe pas.foo >> bar
: exécute le programmefoo
et enregistre sa sortie dans le fichierbar
, l' ajoute à son contenu et le crée s'il n'existe pas.foo < bar
: s'exécutefoo
, lui disant de lire l'entrée du fichierbar
.C'est
<<
un cas particulier, car il n'y a aucun intérêt à "ajouter" une entrée à une commande,<<
c'est principalement (exclusivement AFAIK) utilisé pour Here Documents :La construction
<< SomeStringHere > Out.file
redirigera tout le texte écrit jusqu'à ce qu'il rencontre la chaîne de fin (EOF
dans l'exemple ci-dessus) vers le fichier cible. Ici, les documents vous permettent de formater facilement des chaînes multi-lignes et d'inclure des variables et des caractères spéciaux.L'
<<<
opérateur, la chaîne Here , est comme un document Here mais il développe les variables. Ainsi, par exemple:La commande ci-dessus est équivalente à
echo "$bar" | grep foo
.Ce que vous recherchez réellement s'appelle la substitution de processus et est une autre façon de passer la sortie d'une commande à une autre. Il se compose de
<(command)
.Donc, pour votre
at
exemple, vous pourriez faireCe qui précède fonctionne car la substitution de processus crée réellement un fichier (lisez le lien ci-dessus pour plus de détails) et c'est le descripteur de fichier de ce fichier qui est transmis
<
àat now
.1 Le comportement par défaut est d'écraser, cela peut être modifié en définissant l'
noclobber
option sur bash. S'il est défini,echo foo > bar
échouera s'ilbar
existe. Dans ce cas, il peut être forcé d'utiliser à laecho foo |> bar
place. Voir la section 3.6.2 ici .la source
<<
et<<<
(que @steeldriver a mentionné dans sa réponse). De plus, y a-t-il plus - quelque chose comme>>>>>>
ou<<<<<<<<<<
?<<<
:)Dans ce cas,
echo "notify-send HELLO"
est un processus et non un fichier - vous avez donc besoin d'une substitution de processus plutôt que d'une redirection de fichierVous auriez également pu utiliser une chaîne ici pour éviter
echo
complètement la commandela source