⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hash.def

📁 android-w.song.android.widget
💻 DEF
字号:
This file is hash.def, from which is created hash.c.It implements the builtin "hash" in Bash.Copyright (C) 1987-2010 Free Software Foundation, Inc.This file is part of GNU Bash, the Bourne Again SHell.Bash is free software: you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation, either version 3 of the License, or(at your option) any later version.Bash is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with Bash.  If not, see <http://www.gnu.org/licenses/>.$PRODUCES hash.c$BUILTIN hash$FUNCTION hash_builtin$SHORT_DOC hash [-lr] [-p pathname] [-dt] [name ...]Remember or display program locations.Determine and remember the full pathname of each command NAME.  Ifno arguments are given, information about remembered commands is displayed.Options:  -d		forget the remembered location of each NAME  -l		display in a format that may be reused as input  -p pathname	use PATHNAME is the full pathname of NAME  -r		forget all remembered locations  -t		print the remembered location of each NAME, preceding		each location with the corresponding NAME if multiple		NAMEs are givenArguments:  NAME		Each NAME is searched for in $PATH and added to the list		of remembered commands.Exit Status:Returns success unless NAME is not found or an invalid option is given.$END#include <config.h>#include <stdio.h>#include "../bashtypes.h"#if defined (HAVE_UNISTD_H)#  include <unistd.h>#endif#include <errno.h>#include "../bashansi.h"#include "../bashintl.h"#include "../shell.h"#include "../builtins.h"#include "../flags.h"#include "../findcmd.h"#include "../hashcmd.h"#include "common.h"#include "bashgetopt.h"extern int posixly_correct;extern int dot_found_in_search;extern char *this_command_name;static int add_hashed_command __P((char *, int));static int print_hash_info __P((BUCKET_CONTENTS *));static int print_portable_hash_info __P((BUCKET_CONTENTS *));static int print_hashed_commands __P((int));static int list_hashed_filename_targets __P((WORD_LIST *, int));/* Print statistics on the current state of hashed commands.  If LIST is   not empty, then rehash (or hash in the first place) the specified   commands. */inthash_builtin (list)     WORD_LIST *list;{  int expunge_hash_table, list_targets, list_portably, delete, opt;  char *w, *pathname;  if (hashing_enabled == 0)    {      builtin_error (_("hashing disabled"));      return (EXECUTION_FAILURE);    }  expunge_hash_table = list_targets = list_portably = delete = 0;  pathname = (char *)NULL;  reset_internal_getopt ();  while ((opt = internal_getopt (list, "dlp:rt")) != -1)    {      switch (opt)	{	case 'd':	  delete = 1;	  break;	case 'l':	  list_portably = 1;	  break;	case 'p':	  pathname = list_optarg;	  break;	case 'r':	  expunge_hash_table = 1;	  break;	case 't':	  list_targets = 1;	  break;	default:	  builtin_usage ();	  return (EX_USAGE);	}    }  list = loptend;  /* hash -t requires at least one argument. */  if (list == 0 && list_targets)    {      sh_needarg ("-t");      return (EXECUTION_FAILURE);    }  /* We want hash -r to be silent, but hash -- to print hashing info, so     we test expunge_hash_table. */  if (list == 0 && expunge_hash_table == 0)    {      opt = print_hashed_commands (list_portably);      if (opt == 0 && posixly_correct == 0)	printf (_("%s: hash table empty\n"), this_command_name);      return (EXECUTION_SUCCESS);    }  if (expunge_hash_table)    phash_flush ();  /* If someone runs `hash -r -t xyz' he will be disappointed. */  if (list_targets)    return (list_hashed_filename_targets (list, list_portably));      #if defined (RESTRICTED_SHELL)  if (restricted && pathname && strchr (pathname, '/'))    {      sh_restricted (pathname);      return (EXECUTION_FAILURE);    }#endif  for (opt = EXECUTION_SUCCESS; list; list = list->next)    {      /* Add, remove or rehash the specified commands. */      w = list->word->word;      if (absolute_program (w))	continue;      else if (pathname)	{	  if (is_directory (pathname))	    {#ifdef EISDIR	      builtin_error ("%s: %s", pathname, strerror (EISDIR));#else	      builtin_error (_("%s: is a directory"), pathname);#endif	      opt = EXECUTION_FAILURE;	    }	  else	    phash_insert (w, pathname, 0, 0);	}      else if (delete)	{	  if (phash_remove (w))	    {	      sh_notfound (w);	      opt = EXECUTION_FAILURE;	    }	}      else if (add_hashed_command (w, 0))	opt = EXECUTION_FAILURE;    }  fflush (stdout);  return (opt);}static intadd_hashed_command (w, quiet)     char *w;     int quiet;{  int rv;  char *full_path;  rv = 0;  if (find_function (w) == 0 && find_shell_builtin (w) == 0)    {      phash_remove (w);      full_path = find_user_command (w);      if (full_path && executable_file (full_path))	phash_insert (w, full_path, dot_found_in_search, 0);      else	{	  if (quiet == 0)	    sh_notfound (w);	  rv++;	}      FREE (full_path);    }  return (rv);}/* Print information about current hashed info. */static intprint_hash_info (item)     BUCKET_CONTENTS *item;{  printf ("%4d\t%s\n", item->times_found, pathdata(item)->path);  return 0;}static intprint_portable_hash_info (item)     BUCKET_CONTENTS *item;{  printf ("builtin hash -p %s %s\n", pathdata(item)->path, item->key);  return 0;}static intprint_hashed_commands (fmt)     int fmt;{  if (hashed_filenames == 0 || HASH_ENTRIES (hashed_filenames) == 0)    return (0);  if (fmt == 0)    printf (_("hits\tcommand\n"));  hash_walk (hashed_filenames, fmt ? print_portable_hash_info : print_hash_info);  return (1);}static intlist_hashed_filename_targets (list, fmt)     WORD_LIST *list;     int fmt;{  int all_found, multiple;  char *target;  WORD_LIST *l;  all_found = 1;  multiple = list->next != 0;  for (l = list; l; l = l->next)    {      target = phash_search (l->word->word);      if (target == 0)	{	  all_found = 0;	  sh_notfound (l->word->word);	  continue;	}      if (fmt)	printf ("builtin hash -p %s %s\n", target, l->word->word);      else	{	  if (multiple)	    printf ("%s\t", l->word->word);	  printf ("%s\n", target);	}    }  return (all_found ? EXECUTION_SUCCESS : EXECUTION_FAILURE);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -