タグ付けされた質問 「shell」

シェルは、Unixのコマンドラインインターフェイスです。シェルにインタラクティブにコマンドを入力するか、スクリプトを記述してタスクを自動化できます。/ bin / shおよび最も互換性のあるシェル(ash、bash、ksh、zshなど)に適用される質問には、このタグを使用します。エラーのあるシェルスクリプトについては、ここに投稿する前にhttp://shellcheck.netで確認してください。

2
$ {#1}の価値は?
${#1}以下の使い方を説明してください: getlable () { if (( ${#1} == 0 )); then test="-"; else test="${1}"; fi; }
9 shell 

5
xargsにスペースと猫からの特殊文字を処理させる方法は?
私が持っているfile名前のリストが含まれていることを。つまり: Long Name One (001) Long Name Two (201) Long Name Three (123) ... スペースといくつかの特殊文字。私はこれらの名前からディレクトリを作りたかった、すなわち: cat file | xargs -l1 mkdir それはすなわち、個々のディレクトリをスペースで区切っなりLong、Name、One、Two、Three、代わりの Long Name One (001)、Long Name Two (201)、Long Name Three (123)。 どうやってやるの?

2
sshログインにデフォルト以外のログインシェルを使用する方法
現在、認証にLDAPを使用するネットワークで作業しています。zshログインシェルとして設定したsshところ、明らかにzshインストールされていないネットワーク上のマシンの1つを介してリモートアクセスを取得する問題に遭遇しました。ログインは失敗します Dec 8 19:16:11 abert sshd[20649]: User sorokine not allowed because shell /bin/zsh does not exist したがって、質問は基本的に:LDAPで構成されたものとは異なるログインシェルを使用するようにリモートマシンに指示するにはどうすればよいですか? OpenSSH_6.0p1 Debian-4 + deb7u2、OpenSSL 1.0.1e
9 shell  ssh  login 

5
リストされているすべてのパッケージがbashにインストールされているかどうかを確認します
私のバイナリは、これらのboostライブラリとそれぞれのパッケージに依存しています。 NAME | PACKAGE: --------------------------------------+----------------------------------- libboost_serialization.so.1.55.0 | libboost-serialization1.55.0 libboost_thread.so.1.55.0 | ibboost-thread1.55.0 libboost_date_time.so.1.55.0 | libboost-date-time1.55.0 libboost_signals.so.1.55.0 | libboost-signals1.55.0 だから私はパッケージのリストを定義したいと思います: boostlibnames="libboost-serialization1.55.0 libboost-thread1.55.0 libboost-date-time1.55.0 libboost-signals1.55.0" そして、それらがすべてインストールされているかどうかを確認してから、実際に実行しapt-get installます。aptがパッケージが既にインストールされているかどうかを自動的にチェックすることはわかっていますが、不足しているライブラリをインストールする前に、ユーザーにプロンプ​​トを表示したいのですが。 それで、リストされたすべてのライブラリ(上記の変数)がインストールされているかどうかを確認する良い方法はありますか?
9 shell  apt  dpkg 

2
シェルで変数を間接的に展開する
bashシェルで変数を間接的に参照する必要があります。 基本的にmake書いてできることをしたいです$($(var))。 私は${$var}最も簡単な解決策であるものを使用しようとしましたbashが、このエラーが発生します: bash: ${$var}: bad substitution これを行う方法はありますか? 私は何をしようとしています(すべての引数反復処理することで$1、$2、$3反復変数を使用してプログラムに、...)を、私は間接せずにこれを行うことはできません。


5
現在のシェルインタープリター名を*確実に*かつ*簡単に*取得するにはどうすればよいですか?
(コマンドラインからではなく)スクリプトまたはソースファイル内から現在のシェルの名前を取得する簡単で信頼性の高い方法を探しています。私はちょうどそうすることを期待していました$(basename "$SHELL")が、ログインシェルがzshあり、some_script.shに次のコードがある場合 this_shell=$( basename "$SHELL" ) echo "The Shell is $this_shell" echo "The Shell is $0" そして私はそれを実行しbash some_script.sh、それはまだ示していますzsh代わりにbash使用インタプリタがあるにもかかわらず/bin/bash。シェルの設計者が現在のシェルではなくデフォルトのシェルを表示するように選択した理由はわかりませんが、それが私たちが行き詰まっているようです。 他にも少し似た質問がありますが(こことここ)、その答えは多くの点で不十分です。 多くの場合、ユーザーが現在使用している対話型シェルを把握しようとしていると想定しますが、それはおかしいです。シェルかを決定することができるようにどこでも実行することができ、私の必要性のコード-私はにコマンドを入力してるシェル知っている、それが使用されます。 彼らはしばしばいくつかの異なることを試みます-再びあなたがコマンドラインにいて、あなたがbashを使用していることを学ぶまでただいじくり回すことができるかのように-しかし、私はすべてのコンテキストで信頼できる単一のものが必要です。 彼らはしばしばのようなスクリプトから全く役に立たないものを与えecho $0ます。上記のスクリプトに示すように、これは失敗します。(はい、それはインタラクティブなシェルコマンドラインで機能しますが、なぜあなたが使用しているシェルを知らないのですか?) 彼らは時々(私の限られたテストでは)のような正しい情報を含むコマンドを提供しますがps -p $$、クロスプラットフォームでクロスシェル互換のsed / awkコマンドが不足しているため、パイプを介してシェル名のみを取得し、付随する他の情報を無視します乗る。 彼らは次のように、シェルのみのカップルで動作するものが含まれる$BASH_VERSIONと$ZSH_VERSION。私はそのような可能な限り多くのシェルとしてサポートしたいですfish、csh、tcsh。 私はどのように行う、確実かつ正確に検出任意の 現在のシェルを?私は、プラットフォーム間で、スクリプト内で、そして可能な限り多くのシェルで機能する何かを探しています1。 更新:私がこの質問を投稿したとき、私はこの情報を提供するためにシェルに組み込まれたいくつかの機能があると予想しましたが、そうではないようです。現在、シェルの外の何かに依存することは避けられないように思われるので、クロスプラットフォームソリューションを求めていることをより明確にする必要があります(上記の他の回答への私の反対には暗示されていますが、そうしないと簡単に見落とされる可能性があります)質問を注意深く読んではいけません)。 Update 2Stéphaneの回答がLinuxのみではないために、これがLinuxのみの質問の重複であるとまだだれもが信じている場合、私が求めているものと彼が提供したものとの違いは次のとおりです。(彼が書いたものは独創的であり、私はそれをノックしていませんが、それは私の問題を解決しないことに注意してください。) 私は何かを探していますシンプルかつ信頼性の高い、その (によって供給されることを任意のスクリプトや関数定義に追加することができ.zshrcたり.bash_profile、分岐または何でも)。 彼のスクリプトは、デフォルトのインタプリタによって常に解釈されて返されるため、インタプリタ名を呼び出し側のスクリプト/関数に渡す外部ユーティリティとして使用することはできません。これは私の目的に使用することを困難または不可能にします。可能であれば、それは非常に非常に困難であり、それを機能させるための解決策は答えに記載されていません。したがって、彼は私の質問に答えなかったため、それは重複ではありません。 あなたが何かを見たい場合になる仕事を、見とるGitHubの上ShellDetectiveを。これにより、SEに既に存在するものと、この質問が探しているものとの違いを簡単に確認できる場合があります(実際、この質問のニーズを満たすために作成されたもので、他では満たされていないものです)。 (PSあなたはにソース取得機能を想像し、このためのユースケースがあります信じることができない場合.zshrc、.bash_profileまたは.profile使用されているものを、サーバーに依存し、どのようなシェルそれが利用可能です。彼らはシェバング行を持っていないので、彼らが調達している。彼らは、どのシェルでも動作する場合に最も便利ですが、動作方法を知るために、どのシェルにいるかを知る必要がある場合もあります。) 1伝統的な意味でのシェルではない「シェル」には関心がありません。誰かが自分で書いたシェルについては気にしていません。私だけに関係してる本当のシェル実際に野生で発生し、そしてその誰か多分彼らはちょうど彼らが好きなシェルいくつかのサーバにログインをインストールすることはできませんれているときに使用する必要がある場合があります。
9 bash  shell  zsh 

2
find -execのifコマンド
私は現在のディレクトリの下にあるすべてのディレクトリとファイルを一覧表示し、それらがファイルまたはディレクトリである場合は、次のコマンドで書き込もうとしました: find -exec echo `echo {} : ;if [ -f {} ]; then echo file; else echo directory;fi` \; 私はそれがばかげたコマンドであることを知っています、-type fまたはのような他のものを使用できます-type dが、そのコードの一部が期待どおりに機能しなかった理由を知りたいです。それらすべてにディレクトリを出力するだけです。たとえば、出力findは次のとおりです。 . ./dir ./dir/file 私のコードの出力は: . : directory ./dir : directory ./dir/file : directory そしての出力 echo `echo dir/file : ;if [ -f dir/file ]; then echo file; else echo …

2
パスを指定してファイルシステムのUUIDを取得するにはどうすればよいですか?
ディレクトリまたはファイルのパスを渡されます。 このディレクトリ/ファイルが配置されているファイルシステムのUUIDを確実に提供するユーティリティ/シェルスクリプトはどれですか。 ファイルシステムのUUIDとはUUID=...、たとえばblkid Redhat Linuxを使用しています。 (誰かがここunix.stackexchange.comでこれを尋ねるべきだと誰かが提案したので、元のstackexchange.comから移動しました)

1
ディレクトリシンボリックトラバーサルと親ディレクトリについて
ディレクトリが/dir1あり/dir2/linked、後者が前者へのシンボリックリンクであるとしましょう。 ときにあなたがcdするlinkedとpwd、あなたは出力を得ます/dir2/linked。その後cd ..、あなたは着られるでしょう/dir2。この振る舞いは、あなたが/dir2/linked以前にいたという概念と一致しています。ただし、私が理解しているように、..任意のディレクトリの親ディレクトリ()は、ディレクトリiノード(つまり、物理的にディスク)に格納されています。明らかに、/dir2/linkedは本当になので/dir1、iノードの親ディレクトリは/ さらに複雑な問題に、内部ながら/dir2/linked、の出力ls ..とはcd .. ; ls .異なっています!cdシンボリックリンクされたパスを尊重しているように見えますが、ls「物理的な」パスを尊重しています。ただし、この質問で述べたようにcd -P、このユースケースにはあります。 man pwd 「物理」および「論理」作業ディレクトリについて言及していますが、この時点ではまだいくつか質問があります。 でPWD述べたように、この動作は常に環境変数によって提供されman pwdますか? それらが両方ともシェルコマンド(つまり、プログラムではない)である場合、なぜデフォルトcdでls動作が異なるのですか? 一般的なプログラム(シェルコマンドではない)PWDは、物理パスの代わりに使用しますか?実装次第だと思いますが、経験則はありますか?

3
末尾の改行を削除せずにstdinを変数にキャプチャするにはどうすればよいですか?
シェルスクリプトで... 末尾の改行を削除せずにstdinを変数にキャプチャするにはどうすればよいですか? 今私は試しました: var=`cat` var=`tee` var=$(tee) すべての場合$varにおいて、入力ストリームの末尾の改行はありません。ありがとう。 また、入力に後続の改行がない場合、ソリューションは追加しません。 承認された回答に照らして更新: 私のコードで使用した最終的な解決策は次のとおりです。 function filter() { #do lots of sed operations #see https://github.com/gistya/expandr for full code } GIT_INPUT=`cat; echo x` FILTERED_OUTPUT=$(printf '%s' "$GIT_INPUT" | filter) FILTERED_OUTPUT=${FILTERED_OUTPUT%x} printf '%s' "$FILTERED_OUTPUT" 完全なコードを確認したい場合は、エキスパンダーのgithubページを参照してください。エキスパンダーは、情報セキュリティの目的で開発した小さなオープンソースのgitキーワード展開フィルターシェルスクリプトです。.gitattributesファイル(ブランチ固有にすることができます)およびgit configで設定されたルールに従って、git は、リポジトリにチェックインまたはチェックアウトするたびに、expandr.shシェルスクリプトを介して各ファイルをパイプ処理します。(そのため、末尾の改行またはその欠如を保持することが重要でした。)これにより、機密情報をクレンジングし、テスト、ステージング、およびライブブランチの環境固有の値の異なるセットを交換できます。

6
リモートマシンにインストールされていないシェルを使用する
シナリオを考えると: リモートマシン:SSHサーバー。ユーザーには管理者権限がありません。 ローカルマシン:SSHクライアント。ユーザーには管理者権限があります。 場合は、ユーザは、へのログインリモートからローカル、と対話したいリモートにインストールされていないシェル使用してリモートを、どのように缶ユーザーはこれだけでは達成しますか? 例:ユーザーが使用して魚を上のローカル、および上でそれを使用することも望んでリモートが、遠隔だけ持ちのbashとzshのがインストールされています。

1
「su -c」で起動したコマンドからプロセスIDを取得する
シェル内でJavaプログラムを実行し、プロセスIDをテキストファイルに書き込んでいます。だから私がこれをするとき: nohup java app.Main > /dev/null 2>&1 & echo $! > /var/run/app.pid できます。しかし、本当に別のユーザーとして実行したい su - appuser -c "nohup java app.Main > /dev/null 2>&1 &" echo $! > /var/run/app.pid これは機能しません。-cオプションで起動されたコマンドのプロセスIDを取得する方法はありますか?
9 bash  shell  su 

1
現在の設定でxorg.confを再生成します
多くの人がこの問題について話しましたが、満足のいく答えは見つかりませんでした。 私はdebian jessieです。現在nvidia-driver、ドライバーとして試してみましたが、システムがクラッシュしました。すべてのnvidiaパッケージを削除しました。しかし、問題は/etc/X11/xorg.confNVidia設定に置き換えられ、バックアップxorg.conf.backupが削除されたことです。 NVidiaが設定する関連構成は次のとおりです。 Section "Device" Identifier "Device0" Driver "nvidia" VendorName "NVIDIA Corporation" EndSection 私は一度(また-> )に変更しようとしnvidiaましたが、解像度ははるかに低くなっています(私のラップトップにはに記載されているとおりです)。だから私はドライバーとして使う必要があるかもしれません。ただし、単にに変更しても機能しません。intelNVidiaIntelIntel Corporation Haswell-ULT Integrated Graphics Controllerlspcinouveaunvidianouveau 最近のXシステムはxorg.conf(by rm /etc/X11/xorg.conf)なしで起動できるようですが、遅いようです。したがって、私は現在の設定でxorg.confを優先します。 のバージョンXorg: X.Org X Server 1.16.0 Release Date: 2014-07-16 X Protocol Version 11, Revision 0 Build Operating System: Linux 3.14-1-amd64 x86_64 Debian Current Operating System: Linux debian …


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.