has

授权协议 MIT License
开发语言 SHELL
所属分类 应用工具、 终端/远程登录
软件类型 开源软件
地区 不详
投 递 者 赖浩荡
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

has

has checks presence of various command line tools on the PATH and reports their installed version.

Quick Start ��

Just install the has script, (there is no dependency apart from bash itself). From the command line, pass the list of commands you want to check as arguments to has, for example:

$ has node npm java git gradle
✔ node 8.2.1
✔ npm 5.3.0
✔ java 1.8.0
✔ git 2.14.1
✔ gradle 4.0.1

If everything is good has exits with status code 0. The exit status code reflects number of commands not found on your path.

$ has node go javac
✔ node 8.2.1
✔ go 1.8.3
✘ javac

And echo the status:

$ echo $?
1

Use has in scripts

has can be used in shell scripts to check presence of tool in very readable way

if has node
    then echo you have what it takes ��
fi

Pro Tip: the has in above command can be replaced with the entire curl command for to ensure portability of script → if curl -sL https://git.io/_has | bash -s node then ...

Installing ��

has is a single bash script that does it all. You can download the script and make it available on your $PATH. However, to make it even simpler, just follow one of these methods.

Homebrew (MacOS) ��

Just run the following:

brew install kdabir/tap/has

Cloning the Repo

Just execute the following command in a terminal: it clones has repo and installs it into your path.

git clone https://github.com/kdabir/has.git && cd has && sudo make install

For a non-root installation:

git clone https://github.com/kdabir/has.git
cd has
make PREFIX=$HOME/.local install

To update just do a git fetch or make update followed by the appropriate make install command.

Downloading to a file

curl -sL https://git.io/_has > /usr/local/bin/has
curl -sL https://git.io/_has | sudo tee /usr/local/bin/has >/dev/null

These commands are safe to be called multiple times as well (to update has)

Running directly off the Internet

If you are lazy, you can run has directly off the Internet as well:

curl -sL https://git.io/_has | bash -s git node npm
✔ git 2.17.1
✔ node 11.11.0
✔ npm 6.7.0

ProTip: if that's too much typing every time, setup an alias in your .bashrc/.zshrc file:

alias has="curl -sL https://git.io/_has | bash -s"

And use it

$ has git
✔ git 2.17.1
$ type has
has is aliased to `curl -sL https://git.io/_has | bash -s'

Command not understood by has?

Let's say $ has foobar returns foobar not understood, because has may not have whitelisted foobar.

In such cases, pass HAS_ALLOW_UNSAFE=y has foobar. This should still check for existance of foobar and tries to detect version as well.

the value must exactly be y for it to work.

The .hasrc file

has looks for .hasrc file in the directory from where has command is issued. This file can contain commands that haswill check for. List one command per line. Lines starting with # are treated as comments.

Following is example of .hasrc file:

# tools
git
curl

# interpreters
ruby
node

When has is run in directory containing this file, it produces:

$ has
✔ git 2.19.1
✔ curl 7.54.0
✔ ruby 2.3.1
✔ node 10.7.0

Also, CLI arguments passed to has are additive to .hasrc file. For example, in the same dir, if the following command is fired,has checks for both commands passed from cli args and provided in .hasrc file.

$ has java
✔ java 11.0.1
✔ git 2.19.1
✔ curl 7.54.0
✔ ruby 2.3.1
✔ node 10.7.0

Pro Tip: commit .hasrc file in root of your project. This can work as a quick check for confirming presence all commandline tools required to build and run your project.

On machines that don't even have has installed, your project's .hasrc is honored by this command:

curl -sL https://git.io/_has | bash -s

take a look at .hasrc file for this repo.

Contributing

  1. Star the repo, tweet about it, spread the word
  2. Update the documentation (i.e. the README file)
  3. Adding support for more commands
  4. Adding more features to has

Adding more tools

The current list of supported packages can be viewed with bash tests/packages_all.sh

If the command you wish to include supports any of -v, --version, -version, version, -V then you can findcorresponding function which can be called to check presence and extract version. However, for many tools versionextraction may not work and you will need to add custom parsing of command's output. The has script is commentedto guide developers about what needs to be done to add more tools.

/tests/test_all_packages.bats will test every package has supports. This includes newly added commands so please add new packages to

  • alpine.Dockerfile and ubuntu.Dockerfile to install the tool OR
  • packages_alpine_skip.txt and packages_ubuntu_skip.txt to exclude the package from the tests

Adding Features

If you are contributing a feature, please ensure to check current tests. Add test cases for your feature. Tests areexecuted using the excellent bats testing framework. Add tests and run make test

Raise the PR and make sure the tests pass on Travis-CI.

  • 昨日的chrome 105更新带来了:has()和:modal的支持。 chrome更新介绍页 :has () 伪类 :has () 伪类是一个选择器,它指定一个元素,该元素至少有一个与作为参数传递的相对选择器匹配的元素。:has 伪类提供了一种将样式规则应用于特定元素的前面元素(前面的兄弟姐妹 / 祖先 / 祖先的前面的兄弟姐妹)的方法。 CSS 的 :has() 伪类选择器和 :not() 有

  • HashMap 的底层实现原理 本文参考javaguide提供的面试题,可以了解详情javaguide 同时参考了其他博主的文章了解详情 简介 HashMap是用来存储键值对的一种集合,它基于哈希表的Map接口实现 HashMap继承与AbstractMap类和实现Map接口 HashMap在jdk1.7之前是由数组加链表组成的,在jdk1.8之后为了提高查询效率增加了红黑树这种数据结构。 当链表

  • IS-A、HAS-A和USE-A都是用来便是类与类之间的关系 IS-A表示继承。父类与子类,具有很高的耦合度。 HAS-A表示组合。是整体与部分的关系,同时它们的生命周期都是一样的。 USE-A表示依赖。依然是其中一个拥有另外一个,但是不负责销毁,也就是声明周期不一样。 简单的讲一些名词怎么能少得了例子呢? 在IOS中,你要实现一个遥控器,通常都是继承与UIViewController的,你自己的

  •   在学习继承的过程中,不管是在书中还是在网上找资料,都跟多态分不开,其中还有个很抓人眼球的问题,那就是书上总是说的is-a关系和has-a关系。   很多书中讲到继承时都会说:   public继承是一个接口继承,保持is-a原则,每个父类可用的成员对子类也可用,因为每个子类对象也都是一个父类对象。   protetced/private继承是一个实现继承,基类的部分成员并非完全成为子类接口的一

  • 派生类和基类之间的特俗关系是基于C++继承的底层模型的。 总所周知,C++具有三种继承:公有继承、私有继承、保护继承。 最常见的就是公有继承,它建立一种is-a的关系。 如何理解is-a呢?即派生类对象也是一个基类对象,可以对基类对象执行的任何操作,也可以对派生类对象执行。 举个栗子: 有一个水果Fruit类,可以保存水果的重量和热量; 香蕉是一种水果,所以可以从Fruit类派生出Banana类;

  • 首先,这3个的大致中文意思: hasOne:有一个,加上主谓语应该是 ,A 有一个 B hasMany:有很多,A 有很多 B belongsTo:属于, A 属于 B 这里我们准备3张表来理解他们的关系: user_group 用户分组表:id、title user 用户表:id、user_group_id、username、password profile 用户信息表:id、user_id、n

  • 【实用技巧分享】电脑报错ERROR:NO BOOT DISK HAS BEEN DETECTED OR THE DISK HAS FAILED 作为一个非专业修理电脑的,维护项目总会碰到电脑故障的问题,可能一星期至少每天要碰到1次,而真正硬件损坏的事件占的比例可能只有10%左右。 前言 本文针对的是台式机(如ACER D830和LENOVO 启天M6400),至于其他型号台式机是否有用还需要看主板

 相关资料
  • 问题内容: 我正在用Java写一个简单的编辑文本。当用户打开文件时,将在中打开文件。我执行以下操作来保存打开的文件: 将从何处接收值,例如:。 我有一堂课: 现在,在此类中,我需要获取存储在中的值。我怎样才能做到这一点? 问题答案: 要从地图获取所有值: 要从地图中获取所有条目,请执行以下操作: Java 8更新: 处理所有值: 要处理所有条目:

  • 问题内容: 如果没有覆盖该方法,默​​认的实现是什么? 问题答案: 然后,此类从其祖先之一继承。如果它们都不覆盖它,则使用Object.hashCode。 从文档: 在合理可行的范围内,由Object类定义的hashCode方法确实为不同的对象返回不同的整数。(通常通过将对象的内部地址转换为整数来实现,但是JavaTM编程语言不需要此实现技术。) 因此默认实现是特定于JVM的

  • 问题内容: 如何编写返回类a或类b的类型安全的Java方法?例如: 什么是最干净的方法? (我想到的唯一的事情就是使用显然很糟糕的异常,因为它滥用了通用语言功能的错误处理机制… ) 问题答案: 我模拟代数数据类型的一般公式是: 该类型是一个抽象基类,而构造函数是该类的子类。 每个子类中都定义了每个构造函数的数据。(这允许具有不同数量数据的构造函数正常工作。它也不需要维护不变式,例如仅一个变量为非n

  • 问题内容: 关于如何考虑 超字段的 子类中的 Override &in,是否有特定规则?知道有很多参数:超字段是private / public,有/没有getter … 例如,Netbeans生成的equals()和hashCode()不会考虑超级字段…和 将返回true :( 如果要查看Netbeans生成的equals()和hashCode(): 问题答案: 儿童不应该检查父母的私人成员 但

  • 问题内容: 当我学习Haskell时,我注意到它的 type class ,这应该是源自Haskell的伟大发明。 但是,在Wikipedia页面上,类型为class: 程序员通过指定一组函数或常量名称以及它们各自的类型来定义类型类,对于每个属于该类的类型,它们必须存在。 对我来说,这似乎与 Java的接口 非常接近(引用Wikipedia的Interface(Java)页面): Java编程语言

  • 问题内容: 我正在做一个编程项目,并不断收到如下所示的错误。 我认为这是因为扫描仪read.nextLine()超出了文本文件的末尾。但是我在hasNextLine中使用了while循环,所以我不确定为什么会这样。有人知道我要去哪里了吗? 关联文本文件 问题答案: 将仅检查一个新行。您只检查了一行就无法阅读两行。 如果您必须不断读取记录,则可以

  • 问题内容: 因为我有一个包含重复项的int数组的ArrayList,所以我想使用HashSet。不幸的是,我无法按需使用HashSet: 结果是: 有人可以告诉我我错了吗? 在此先感谢Dominique(java newbie) 问题答案: 数组不会在类中重写并实现,因此,只有当a1 == a2时,两个数组a1和a2 才被视为彼此相同,这在您的情况下是错误的。 如果使用s而不是数组,则将解决问题,

  • 问题内容: 我是泛型新手,所以不确定我的问题的答案是否是真的。在下面的代码中,对一个对象条目的键进行大小写需要什么? 它似乎很容易被替换 更多参考: 问题答案: 这是一种极端的优化措施,对于通用编程实践来说可能不是必需的。这是一个可以回答您问题的讨论。下面的语句是从该帖子中复制的: 这是Doug Lea流行的一种编码风格。这是一个极端的优化,可能没有必要。您可以期望JIT进行相同的优化。(您可以尝