Разделите вход для другой команды и объедините результат

Самая вероятная причина состоит в том, что у Вас есть корректное PATH но не корректное LD_LIBRARY_PATH.

Последнее git исполняемый файл является двоичным файлом, который динамично связан. Когда Вы следовали инструкциям по установке, это, вероятно, разместило библиотеки (.so файлы) в /usr/local/lib, необходимо добавить этот путь к Вашему LD_LIBRARY_PATH. Попробуйте его и затем выполните мерзавца:

export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/lib
git

Если это не работает, могли Вы обеспечивать вывод ldd /usr/local/bin/git.Спасибо.

PS: если бы решение работало, то необходимо добавить строку LD_LIBRARY_PATH к Вашему .bash_profile

8
07.02.2015, 16:19
4 ответа

, когда вы должны использовать несколько замен процессов, вы не гарантируете вывод в Любой конкретный порядок, поэтому вам лучше придерживаться

paste -t',' <(commanda < file) <(commandb < file)

, предполагая MyFile Cat для некоторых дорогостоящих трубопроводов, я думаю, вам придется хранить вывод, либо в файле или переменной:

output=$( some expensive pipeline )
paste -t',' <(commanda <<< "$output") <(commandb <<< "$output")

Используя свой пример:

output=$( seq 4 )
paste -d' ' <(cat <<<"$output") <(tac <<<"$output") <(awk '$1*=2' <<<"$output")
1 4 2
2 3 4
3 2 6
4 1 8

Другая мысль: FIFOS и один трубопровод

mkfifo resulta resultb
seq 4 | tee  >(tac > resulta) >(awk '$1*=2' > resultb) | paste -d ' ' - resulta resultb
rm resulta resultb
1 4 2
2 3 4
3 2 6
4 1 8
8
27.01.2020, 20:10

с ZSH :

pee() (
  n=0 close_in= close_out= inputs=() outputs=()
  merge_command=$1; shift
  for cmd do
    eval "coproc $cmd $close_in $close_out"

    exec {i}<&p {o}>&p
    inputs+=($i) outputs+=($o)
    eval i$n=$i o$n=$o
    close_in+=" {i$n}<&-" close_out+=" {o$n}>&-"
    ((n++))
  done
  coproc :
  read -p
  eval tee /dev/fd/$^outputs $close_in "> /dev/null &
    " exec $merge_command /dev/fd/$^inputs $close_out
)

затем используют как:

$ echo abcd | pee 'paste -d,' 'tr a A' 'tr b B' 'tr c C'
Abcd,aBcd,abCd

, это Адаптирован из Этот другой вопрос , где вы найдете несколько подробных объяснений и подсказки на ограничениях (остерегайтесь тупиков!).

3
27.01.2020, 20:10

Для вашего конкретного примера не нужно вставлять , а остальное - . Часто бывает так, что когда мы сталкиваемся с ограничением в стандартном наборе инструментов, это происходит потому, что то, что мы хотим сделать одним способом, может быть сделано другим. Например:

set 1 2 3 4
while [ "$#" -gt 0 ]
do    echo "$1" "$#" "$(($1*2))"
shift;done

... что печатает...

1 4 2
2 3 4
3 2 6
4 1 8

Можно получить файл с содержимым, как вы упоминаете, в массиве оболочки "$@" , как....

set -f; IFS='
'; set -- $(cat)

А для проверки значений аргументов в цикле, подобном вышеуказанному, можно немного изменить исходный тест....

while { [ "$1" -eq "${1-1}" ] ;} 2>&"$((2+!$#))"
do    echo "$1" "$#" "$(($1*2))"
shift;done  3>/dev/null >outfile

...который выводит ошибку в stderr только в том случае, если строка, прочитанная с набором -- $(cat) содержит строку, которая не полностью состоит из одного целого.

0
27.01.2020, 20:10

Оболочка yash имеет уникальные особенности ( перенаправление конвейера и перенаправление процесса ), которые упростите это:

cat myfile | (
  exec 3>>|4
  tee /dev/fd/5 5>(commanda >&3 3>&-) 3>&- |
    commandb 3>&- |
    paste -d , /dev/fd/4 - 3>&-
)

3 >> | 4 ( перенаправление конвейера ) создает канал, в котором конец записи находится на fd 3, а конец чтения - на fd 4.

3> (commanda> & 3) - это перенаправление процесса , немного похоже на подстановку процесса ksh / zsh / bash, но просто выполняет перенаправление и не заменяет / dev / fd / n . ksh > (cmd) более или менее совпадает с yash n> (cmd) / dev / fd / n (там n - дескриптор файла, выбранный ksh , которым вы не можете управлять).

4
27.01.2020, 20:10

Теги

Похожие вопросы