Vous avez besoin d'un shell tel que ksh, zsh, ou bash pour la substitution de processus. Je suppose que la commande diff à laquelle @user1147688 fait référence est celle de busybox. La substitution de processus ne fonctionne pas avec les applications de busybox. Busybox diffère de diffutils diff pour la gestion des tuyaux nommés. Après un peu plus de tests, j'ai découvert que je ne pouvais utiliser la substitution de processus avec busybox diff qu'après avoir créé le répertoire /tmp avec cette commande supersu :
su -mm -d -c 'mount -t tmpfs -o rw,uid=0,gid=0,mode=1777 /tmp /tmp'
Cela crée un temporaire que tous les utilisateurs peuvent utiliser. Pour une raison quelconque, busybox n'utilise pas la variable TMPDIR. Alternativement avec zsh, vous pouvez utiliser busybox diff comme ceci :
busybox diff =(sort ./a) =(sort ./b)
C'est comme diff <(...) <(...)
mais il utilise des fichiers temporaires au lieu de tuyaux nommés. Zsh utilisera le répertoire temporaire en lecture-écriture que vous avez assigné à TMPDIR. Utilisation de TMPDIR=/sdcard
ne fonctionnera pas ici puisque vous ne pouvez pas changer la propriété ou les permissions sur les fichiers /sdcard.
Diffutils diff fonctionne sans aucun problème en utilisant n'importe quel type de substitution de processus.
Voici une fonction qui implémente quelque chose comme diff avec une substitution de processus. Vous pouvez l'utiliser avec busybox diff et tout shell moderne compatible sh qui supporte les tableaux, comme ksh, bash, zsh ou mksh. Cela fonctionnera en supposant que HOME est défini sur un emplacement accessible en lecture-écriture, comme /sdcard sur Android.
# usage: diff2 COMMANDS1 -- COMMANDS2
diff2() {
local i=1 j k cmd1 cmd2 list1 list2
cmd1=()
cmd2=()
while (( i < $# )); do
eval j="\$$i"
if [[ $j = -- ]]; then
k=$i
break
else
cmd1+=("$j")
fi
let i++
done
shift $k
cmd2=("$@")
list1=$HOME/diff$RANDOM
list2=$HOME/diff$RANDOM
eval "${cmd1[@]}" > $list1 2>&1
eval "${cmd2[@]}" > $list2 2>&1
diff $list1 $list2
rm $list1 $list2
}
Vous pouvez ajouter des tuyaux, |
à votre COMMANDE1 ou COMMANDE2, à condition de les citer ou de les mettre en antislash.
Cela fonctionne en divisant l'entrée en deux tableaux avec --
comme séparateur des commandes. Quelques eval
L'abus aide à séparer l'entrée et est nécessaire pour évaluer les commandes qui utilisent des pipes.
La fonction pourrait être encore modifiée pour inclure des options pour diff, soit en utilisant un troisième tableau, soit en analysant avec getopts / GNU getopt. Un troisième tableau avec un autre --
Le séparateur fonctionnerait probablement mieux pour éviter d'avoir à utiliser GNU getopt pour les options longues.