为什么脚本在变量中定义常用命令?

时间:2015-10-13 19:40:36

标签: bash shell sh

我一直在工作地点看到这一点:

#!/bin/sh

.....

CAT=/usr/bin/cat                                  # An alias for cat
MAIL=/usr/bin/mail                                # An alias for mail
WC=/usr/bin/wc                                    # An alias for word count
GREP=/usr/bin/grep                                # An alias for grep
DIRNAME=/usr/bin/dirname                          # An alias for dirname
RM=/usr/bin/rm                                    # An alias for rm
MV=/usr/bin/mv                                    # An alias for mv

.....

这只是我的公司吗?你有没有理由想要说明这些极为常见的命令在哪里?当$CAT已经引用/usr/bin/cat时,为什么我希望cat引用/usr/bin/cat?我错过了什么吗?这似乎是不必要的多余。

4 个答案:

答案 0 :(得分:12)

使用完整路径名确保脚本正常运行,即使它由自定义其PATH环境变量的用户运行,以便它找到这些命令的不同版本而不是脚本所期望的。

使用变量简化了编写脚本的过程,因此每次在脚本中出现命令时都不必编写命令的完整路径名。

答案 1 :(得分:4)

  

这只是我的公司吗?

没有

  

你有没有理由说明这些极为常见的命令在哪里?

  

$CAT已引用cat时,为什么我希望/usr/bin/cat引用/ usr / bin / cat?

确定 cat始终引用/usr/bin/cat?如果您的脚本恰好在路径中前面有不同cat的环境中运行,该怎么办?或者在路径前面只有一个用户控制的目录,用户可以在其中安装流氓cat命令?如果您的脚本恰好使用提升的权限运行,那么您真的想让随机用户能够为您的系统做任何他们想做的事吗?

您确定cat 假设始终引用/usr/bin/cat吗?如果脚本安装在需要不同cat的环境中(比如/usr/local/bin/gnucat),那么您是希望修改一行还是二十行?

  

我错过了什么吗?这似乎是不必要的多余。

是的,你遗失了一些东西。

有人希望避免在他们希望运行/usr/bin/cat的任何地方写出cat,并且希望能够在需要的地方选择不同的cat(或者更可能选择不同的make grepsedvar relationsToSeller = []; $('tr td:first-child').find('a').each(function(index, value) { var portfolioArray = $(this).attr('href').split('&id='); //Ajax request to get username's relation to seller and append text $.post( 'http://localhost/public/?r=matchTable/relationtoseller', { portfolioId: portfolioArray[1] }) .done(function( data ) { //$('tr td').first().text(data); var relationToSeller = data; relationsToSeller.push(relationToSeller); //console.log(relationsToSeller); // Therefore, convert it to a real array var realArray = $.makeArray( relationsToSeller ) // Now it can be used reliably with $.map() $.map( realArray, function( val, i ) { // Do something $('tr:eq(i) td:eq(2)').text(val); }); //$.each(relationsToSeller, function( index, value ) { //var pop = relationsToSeller.pop(); //console.log(relationsToSeller); //console.log( index + ': ' + value ); // console.log($( 'tr:eq( index ) td:eq( 2 )' ).text( value )); //$( 'tr:eq( 5 ) td:eq( 2 )' ).text(value); //$('tr:eq(index) td:eq(2)').text(value); //}); }); }); )。另一方面,人们希望避免对可信脚本的行为造成潜在的不安全外部影响。在shell变量中定义命令的完整路径,然后使用该变量运行命令可以实现这些目标。

答案 2 :(得分:3)

避免这种情况且仍然具有忽略用户环境的安全性的一种方法是明确说明脚本中的变量

#!/bin/sh

PATH=/bin:/usr/bin   # maybe you need something in /usr/sbin, add that
LC_ALL=C             # ignore the user's locale
LD_LIBRARY_PATH=something # or unset it if you want nothing

# then
cat /a/file          # have confidence you're using /bin/cat

可能还有其他人:查看您在代码中使用的程序的手册页。

答案 3 :(得分:2)

欢迎来到没有理所当然的企业。

这些通常被定义为确保正确的版本,或在多个框中强制执行env设置。

https://github.com/torvalds/linux/blob/master/tools/scripts/Makefile.include#L15

这样你可以检查目录是否存在。