Как прозрачно заменить sha1sum на shasum в sh shell?

742
WilliamKF

У меня есть тест, который должен работать на нескольких платформах. На всех других платформах тест используется sha1sum, но на моем Mac OSX El Capitan такая программа не установлена, но shasumпрекрасно работает в качестве замены.

Я пытался создать ссылку с /usr/bin/sha1sumна /usr/bin/shasum, но это не удается, даже с правами root:

bash-3.2$ cd /usr/bin bash-3.2$ sudo ln shasum sha1sum ln: sha1sum: Operation not permitted 

Затем я вставил это в /usr/local/bin:

bash-3.2$ cd /usr/local/bin bash-3.2$ ln -s /usr/bin/shasum sha1sum 

И это похоже на работу:

bash-3.2$ sha1sum -c files.sha1sum smallData.txt: OK 

Но мой тестовый жгут, теперь находящий sha1sum, все еще не работает:

perl version 5.18.2 can't run /usr/local/bin/sha1sum. Try the alternative(s):  (Error: no alternatives found)  Run "man perl" for more information about multiple version support in Mac OS X. 

Я также пытался использовать, alias sha1sum=shasumно сбой с:

sh: line 1: sha1sum: command not found 

Я обнаружил, что моя подвеска выходит из строя, потому что она использует shвместо bash.

sh-3.2$ sha1sum -c files.sha1sum perl version 5.18.2 can't run /usr/local/bin/sha1sum. Try the alternative(s):  (Error: no alternatives found)  Run "man perl" for more information about multiple version support in Mac OS X. sh-3.2$ shasum -c files.sha1sum smallData.txt: OK 

Так почему же это sha1sumне работает, shно shasumработает и sha1sumработает, bashи как я могу sha1sumработать под sh?

Я также не понимаю, почему это не удается:

bash-3.2$ echo "sha1sum -c files.sha1sum" | bash perl version 5.18.2 can't run /usr/local/bin/sha1sum. Try the alternative(s):  (Error: no alternatives found)  Run "man perl" for more information about multiple version support in Mac OS X. 

Теперь я замечаю этот комментарий в /usr/bin/shasumфайле:

The contents of this script should normally never run! The perl wrapper should pick the correct script in /usr/bin by appending the appropriate version. You can try appending the appropriate perl version number. See perlmacosx.pod for more information about multiple version support in Mac OS X. 
1

2 ответа на вопрос

0
WilliamKF

Solution is the link to the the version of shasum with the perl version appended:

cd /usr/local/bin ln -s /usr/bin/shasum5.18 sha1sum 

Or to alias to it:

alias sha1sum=shasum5.18 
Или вы можете проверить Дарвина с помощью `uname -s` и назначить` shasum5.18` переменной `sha1sum` в вашем скрипте. fd0 7 лет назад 0
@ fd0 Похоже на лучший ответ, почему бы не опубликовать его? WilliamKF 7 лет назад 0
У меня нет четкого представления о том, как выглядят ваши сценарии в вашей тестовой программе. fd0 7 лет назад 0
0
APG
echo "" | $(which shasum 2>/dev/null || which sha1sum 2>/dev/null) 

выход:

adc83b19e793491b1c6ea0fd8b46cd9f32e592fc - 

на MacOS / Darwin или Linux

Пожалуйста, объясните, как это отвечает на вопрос. (Я считаю, что вы неправильно поняли вопрос.) Пожалуйста, не отвечайте в комментариях; [отредактируйте] ваш ответ, чтобы сделать его более понятным и полным. Scott 6 лет назад 3