web-dev-qa-db-ja.com

pkgsrcの解凍が壊れていますか?

私はubuntu16.04LTSでpkgsrcを使おうとしています。

インストールは簡単でした。

_$ cvs -q -z3 -d anoncvs@anoncvs.NetBSD.org:/cvsroot checkout -P pkgsrc
$ ./bootstrap --unprivileged
_

次に、ソースから解凍パッケージをインストールしました。それも成功に見えました。

_$ cd pkgsrc/archivers/unzip/
$ bmake
$ bmake install
$ which unzip
/home/xxxx/pkg/bin/unzip
_

ただし、実行時には機能しませんでした。

_$ cd ~

$ ls
aaa.Zip

$unzip aaa.Zip
UnZip 6.00 of 20 April 2009, by Info-Zip.  Maintained by C. Spieler.  Send
bug reports using http://www.info-Zip.org/Zip-bug.html; see README for details.

Usage: unzip [-Z] [-opts[modifiers]] file[.Zip] [list] [-x xlist] [-d exdir]
  Default action is to extract files in list, except those in xlist, to exdir;
  file[.Zip] may be a wildcard.  -Z => ZipInfo mode ("unzip -Z" for usage).

  -p  extract files to pipe, no messages     -l  list files (short format)
  -f  freshen existing files, create none    -t  test compressed archive data
  -u  update files, create if necessary      -z  display archive comment only
  -v  list verbosely/show version info       -T  timestamp archive to latest
  -x  exclude files that follow (in xlist)   -d  extract files into exdir
modifiers:
  -n  never overwrite existing files         -q  quiet mode (-qq => quieter)
  -o  overwrite files WITHOUT prompting      -a  auto-convert any text files
  -j  junk paths (do not make directories)   -aa treat ALL files as text
  -C  match filenames case-insensitively     -L  make (some) names lowercase
  -X  restore UID/GID info                   -V  retain VMS version numbers
  -K  keep setuid/setgid/tacky permissions   -M  pipe through "more" pager
See "unzip -hh" or unzip.txt for more help.  Examples:
  unzip data1 -x joe   => extract all files except joe from zipfile data1.Zip
  unzip -p foo | more  => send contents of foo.Zip via pipe into program more
  unzip -fo foo ReadMe => quietly replace existing ReadMe if archive file newer

$ echo $?
10

$ ls
aaa.Zip
_

エラーコードは10でした コマンドラインで無効なオプションが指定されたことを意味します 。どうして?オプションを追加したとは思いませんでした。私は混乱していた。

そこで、ubuntuのunzipを比較するためにpkgsrcのunzipを削除しましたが、機能しました。

_$ pkg_delete unzip

$ which unzip
/usr/bin/unzip

$ /usr/bin/unzip aaa.Zip
Archive:  aaa.Zip
 extracting: aaa.txt

$ls
aaa.txt aaa.Zip
_

pkgsrcの解凍が壊れていますか?または私がしなければならなかったいくつかの設定を見落としましたか?

update(2017-2-19 14:30):pkgsrcのソースコード(pkgsrc/archivers/unzip)を読んでいます。 bmakeの後に生成されます。これまでのところ、unzip.cを次のように部分的に変更しました。

_-- unzip.c --
int MAIN(argc, argv)
  int argc;
  char *argv[];
{
  int r;

  CONSTRUCTGLOBALS();

  /* for debug ----> */
  int hoge;
  printf("argc %d\n", argc);
  for(hoge = 0; hoge < argc; hoge++){
     printf("argv[%d] %s\n", hoge, argv[hoge]);
  }
  /* for debug <---- */
    r = unzip(__G__ argc, argv);
    DESTROYGLOBALS();
    RETURN(r);
} 

....
....
int unzip(__G__ argc, argv)
  __GDEF
  int argc;
  char *argv[];
{
....
....
#endif /* !NO_ZIPINFO */

      /* for debug ----> */
      printf("argc: %d\n", argc);
      printf("&argc: %d\n", &argc);
      int hoge = 0;
      for(hoge = 0; hoge < argc; hoge++){
        printf("argv[%d]: %s\n", hoge, argv[hoge]);
      }
      /* for debug <---- */

      error = uz_opts(__G__ &argc, &argv);
}

int uz_opts(__G__ pargc, pargv)
  __GDEF
  int *pargc;
  char ***pargv;
{
...
...
  while (++argv, (--argc > 0 && *argv != NULL && **argv == '-')) {
    s = *argv + 1;
    while ((c = *s++) != 0) {    /* "!= 0":  prevent Turbo C warning */

    /* for debug ----> */
    printf("c: %c\n",c);
    /* for debug <---- */

#ifdef CMS_MVS
        switch (tolower(c))
#else
        switch (c)
#endif
       {
       case ('-'):
         ++negative;
         break;
       ...
       ...
       default:
         printf("SET ERROR\n"); /* for debug */
         error = TRUE;
         break;
       }
...
...
#endif /* !SFX */
  return USAGE(error);
...
...
}

#else /* !SFX */
#  ifdef VMS
#    define QUOT '\"'
#    define QUOTS "\""
#  else
#    define QUOT ' '
#    define QUOTS ""
#  endif

int usage(__G__ error)   /* return PK-type error code */
  __GDEF
  int error;
{
  if (error){
    /* for debug ----> */
    puts("PK_PARAM: L");
    /* for debug <---- */
    return PK_PARAM;
  } else {
  ...
  }
}
_

この変更により、uz_opts()unzip()の前にargcとargvが変更されることがわかりました。また、内部的に追加されたオプション_-O CP932_は、uz_opts()swichステートメントに存在しないため、終了コード10が発生します。

_$ unzip aaa.Zip
argc 2
argv[0] unzip
argv[1] /home/xxxx/aaa.Zip
argc: 4
&argc: -740106452
argv[0]: unzip
argv[1]: -O
argv[2]: CP932
argv[3]: /home/xxxx/aaa.Zip
c: O
SET ERROR
UnZip 6.00 of 20 April 2009, by Info-Zip.  Maintained by C. Spieler.  Send
bug reports using http://www.info-Zip.org/Zip-bug.html; see README for details.

Usage: unzip [-Z] [-opts[modifiers]] file[.Zip] [list] [-x xlist] [-d exdir]
  Default action is to extract files in list, except those in xlist, to exdir;
  file[.Zip] may be a wildcard.  -Z => ZipInfo mode ("unzip -Z" for usage).

  -p  extract files to pipe, no messages     -l  list files (short format)
  -f  freshen existing files, create none    -t  test compressed archive data
  -u  update files, create if necessary      -z  display archive comment only
  -v  list verbosely/show version info       -T  timestamp archive to latest
  -x  exclude files that follow (in xlist)   -d  extract files into exdir
modifiers:
  -n  never overwrite existing files         -q  quiet mode (-qq => quieter)
  -o  overwrite files WITHOUT prompting      -a  auto-convert any text files
  -j  junk paths (do not make directories)   -aa treat ALL files as text
  -C  match filenames case-insensitively     -L  make (some) names lowercase
  -X  restore UID/GID info                   -V  retain VMS version numbers
  -K  keep setuid/setgid/tacky permissions   -M  pipe through "more" pager
See "unzip -hh" or unzip.txt for more help.  Examples:
  unzip data1 -x joe   => extract all files except joe from zipfile data1.Zip
  unzip -p foo | more  => send contents of foo.Zip via pipe into program more
  unzip -fo foo ReadMe => quietly replace existing ReadMe if archive file newer
PK_PARAM: L
_

それから私は環境変数をチェックしました、それはそこにあります...

_$env
...
... 
UNZIP=-O CP932
_

これは何ですか?_.profile_と_.bashrc._で確認できませんでした

1
cul8er

私はこの問題の原因を理解しました。それは環境変数でした。

$ env | sort
...
...
UNZIP=-O CP932

このページ (申し訳ありませんが、日本語で書かれています)によると、このUNZIP変数は、Windowsで作成された日本語などのマルチバイト文字を含むZipアーカイブを抽出するために必要です。この変数は、日本語版としてローカライズされたUbuntuのunzipパッケージによってインポートされていると思います。

したがって、次のようにUNZIP変数を無効にする必要がありました。

$ UNZIP='' unzip aaa.Zip
Archive:  aaa.Zip
 extracting: aaa.txt

$ ls
aaa.Zip aaa.txt
0
cul8er