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

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

1
scpコマンドを入力して、リモートファイルをタブで補完できる魔法とは何ですか?
これはおそらく、私のoh-my-zshセットアップで有効にしたプラグインによって提供される機能です(zshを何年も使用しています)。 公開キーをサーバーに追加してから(パスワードを入力せずにサーバーにSSH接続できるようになった)、scpシェルでコマンドを作成すると、実際にリモートファイルパスをタブ補完できることに気付きました! 例えば $ diff <(scp Remoteuser@remote.domain.net:/var/www/html/ 私はタブを押すと、それはちょうど動作します!(コマンド自体で達成しようとしていることについては、scpstdoutに「コピー」し、それをファイルとしてdiffにフィードします。この方法で、サーバーに展開する正確な変更を確認できます実行中rsync) 私はこの作品をこれほどうまく作っている作品に興味があります。zシェルと統合されたscpに組み込まれているものですか?または、他の何か?

3
新しい開発の代わりに「…」を使用または教える理由はありますか?
エラーを起こしやすいネストやエスケープの構文がより簡単で、少ないため$(...)、古い`ベースの構文よりも最新のコマンド置換構文の方が好ましいことを理解しています。 さらに、/bin/sh現代の使用のほとんどのスタイルのシェルがサポートしているよう$(…)です: バッシュ ash(したがってBusyBox、ほとんどの組み込みLinux) ダッシュ FreeBSD / bin / sh そして、$(…)IEEE 1003.1で指定されています。 だから私は2つの非常に関連した質問があります スクリプトを実行する必要がある特定の古いシステムを知らない限り、シェルスクリプトの新しい開発で `を使用する理由はありますか? 書くだけでUNIXプログラミングの学生に教えない理由はありますか?他の開発者のシェルスクリプトを読んでいる場合に遭遇する可能性があり、本当に古いシステムまたは非標準で作業している場合に必要になる可能性のある古いバリアントとしてのみ$(...)議論します`何らかの理由で)?

6
シェル:「2588の可能性をすべて表示しますか?」
それで、ラップトップを動かしていました(そして、キーボードに設定するという悪い癖があります...)そして私はこれを発見するために目を覚ました: $ すべての2588の可能性を表示しますか?(yまたはn) このようなものを表示するコマンドは何ですか? 私はBashを使用しています。
16 bash  shell 

1
$ PATH環境変数の割合
私の$ PATHは次のようになります。 /home/torbjorr/deployed/vector/x86_64-GNU%2fLinux:/home/torbjorr/deployed/typewriter/x86_64-GNU%2fLinux:/home/torbjorr/deployed/mustudio/x86_64-GNU%2fLinux:/home/torbjorr/deployed/mathext/x86_64-GNU%2fLinux:/home/torbjorr/deployed/doxymax/x86_64-GNU%2fLinux:/home/torbjorr/deployed/c2tex/x86_64-GNU%2fLinux:/home/torbjorr/deployed/x86_64-GNU%2fLinux/wand:/home/torbjorr/deployed/x86_64-GNU%2fLinux/spellesc:/home/torbjorr/deployed/x86_64-GNU%2fLinux/projinit:/home/torbjorr/deployed/x86_64-GNU%2fLinux/herbs:/home/torbjorr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games bashでは、問題なくワンドを呼び出すことができます /home/torbjorr/deployed/x86_64-GNU%2fLinux/wand お気に入り $ wand (i) Mål från "main.cpp" har registrerats (i) Skapar katalog "__wand_targets_dbg" (i) Kör g++ "main.cpp" -fpic -L"/home/torbjorr/deployed" -g -Wall -std=c++11 -I"/home/torbjorr/deployed" -o "__wand_targets_dbg/cb-template ただし、bourneシェル互換モードでは、ワンドが見つかりません。 $ wand sh: 2: wand: not found 問題は、これらのパスの%記号のようです。この符号はURLエンコードによって追加されているため、有効なファイル名ではない場合でも、ディレクトリ名に「GNU / Linux」という名前を使用できます。shで名前を機能させること、またはshコマンドをbashとして機能させることは可能ですか?つまり、/ bashにシンボリックリンクされる/ bin / shコマンドで呼び出された場合でも、bashを同じように動作させます。
16 shell  path  dash  ash 

2
bashの `set -k`オプションの実用的な使用法
set -kbashでオプションを使用するのはいつですか? Bashリファレンスマニュアルには、 コマンド名の前の引数だけでなく、割り当てステートメントの形式のすべての引数がコマンドの環境に配置されます。 このオプションが何をするのかは理解していますが、いつ必要になるか想像できませんでした。
16 bash  shell 

2
適切な許可なしにアスタリスクを展開できません
誰かが私に次のことを説明できますか? $ ls -ld /temp/sit/build/ dr-xr-s--- 3 asdf qwer 4096 Jan 31 2012 /temp/sit/build/ $ ls -ld /temp/sit/build/* ls: /temp/sit/build/*: Permission denied したがって、ここではアスタリスクを使用できません。sudoコマンドで試してみましたが、「permission denied」ではなく「no such file」エラーが表示されます... sudo ls -l /temp/sit/build/* ls: /temp/sit/build/batch*: No such file or directory しかし、*を使用しないと、最終的に機能します sudo ls -l /temp/sit/build/ total 4 dr-xr-s--- 11 asdf qwer 4096 Oct …

2
> |でリダイレクトするもの 行う?
>|出力を単にファイルではなくファイルにリダイレクトする場合はいつ使用する必要があります>か? 私がこれを見せられたときに与えられた説明は、ターゲットファイルが最初に切り捨てられることを保証したということでした。しかし、私は>すでにそれを暗示していたと思いました。 ある>|有益な?

5
生成されたファイル名のリストを引数リストとして使用—スペースあり
によって収集されfindたファイル名のリストを使用してスクリプトを起動しようとしています。特別なものはなく、次のようになります。 $ myscript `find . -name something.txt` 問題は、パス名の一部にスペースが含まれているため、引数の展開時に2つの無効な名前に分割されることです。通常、名前を引用符で囲みますが、ここでは逆引用符の展開によって挿入されます。find各ファイル名の出力をフィルタリングして引用符で囲みましたが、bashがそれらを見るまでにそれらを取り除くには遅すぎて、ファイル名の一部として扱われます: $ myscript `find . -name something.txt | sed 's/.*/"&"/'` No such file or directory: '"./somedir/something.txt"' はい、それがコマンドラインの処理方法のルールですが、どうすれば回避できますか? これは恥ずかしいことですが、私は正しいアプローチを思い付くことに失敗しています。私は最終的にそれをどのように行うかを見つけましたxargs -0 -n 10000...しかし、それは私がまだ聞きたいと思うようなsuchいハックです:バッククォート展開の結果を引用する方法、または別の方法で同じ効果を達成するにはどうすればよいですか? 編集:私は、事実について混乱していたxargs んそれはそう言われていますか、システムの制限を超えることがありますしない限り、単一の引数リストにコレクトすべての引数を。まっすぐに設定してくれてありがとう!他の人は、受け入れられた答えを読んでいるときにこれを覚えておいてください。なぜなら、それは直接指摘されていないからです。 私は答えを受け入れましたが、私の質問は残ります:バックティック(または$(...))拡張でスペースを保護する方法はありませんか?(受け入れられた解決策は非bash回答であることに注意してください)。


3
バックグラウンドで実行されているbashシェルスクリプトを終了する
多くの場合、bashシェルスクリプトを使用して、さまざまなファイルに対して簡単なコマンドを実行します。例えば、私は次があるとbash呼ばれるシェルスクリプト、script.shプログラム/コマンドを実行し、foo3つのテキストファイルには"a.txt"、"b.txt"、"c.txt": #!/bin/bash for strname in "a" "b" "c" do foo $strname".txt" done また、それfoo $strname".txt"が遅いと仮定すると、スクリプトの実行には長い時間がかかります(たとえば、数時間または数日)。このためnohup、端末が閉じられたり切断されたりしても実行が継続されるように使用したいと思います。また、スクリプトをすぐにバックグラウンドに移動させたいので、&演算子を使用します。したがって、次のコマンドを使用して呼び出しますscript.sh。 nohup bash script.sh & これは、スクリプトをバックグラウンドでハングアップせずに実行する場合には正常に機能しますが、何らかの理由である時点で実行を終了したいとします。これどうやってするの? 私が遭遇した問題は、を見るとtop、にfoo対応するものだけが見えること"a.txt"です。そのfoo呼び出しを終了することはできますが、foo対応する"b.txt"が呼び出されると、その呼び出しも終了する必要があります。forループで指定された数十または数百のテキストファイルの場合、すべてfooを1つずつ終了するのは面倒です!そのため、代わりにシェルスクリプトから発行された特定の呼び出しではなく、シェルスクリプト自体を代わりに終了する必要があります。 コマンドを入力するとき ps -u myusername myusernameユーザー名はどこにあるのか、実行中のプロセスのリストを取得します。しかし、という2つの異なるプロセスIDが表示されbashます。これらのプロセスがあれば、どのプロセスが元の呼び出しに対応しているかを知るにはどうすればよいnohup bash script.sh &ですか?

2
bashスクリプトで引数をループする方法
引数の量が不明なbashスクリプトを書きたいと思います。 これらの議論をどのように歩き、それらで何かをすることができますか? 間違った試みは次のようになります。 #!/bin/bash for i in $args; do echo $i done
16 bash  shell  arguments 

2
パイプコマンドの並列実行
次のシナリオを検討してください。2つのプログラムAとBがあります。プログラムAは文字列の標準出力行に出力し、プログラムBは標準入力からの行を処理します。これらの2つのプログラムを使用する方法は、もちろん次のとおりです。 foo @ bar:〜$ A | B 今、私はこれが1つのコアのみを消費することに気付きました。したがって、私は疑問に思っています: プログラムAとBは同じ計算リソースを共有していますか?その場合、AとBを同時に実行する方法はありますか? 私が気づいたもう1つのことは、AがBよりもはるかに高速に実行されることです。したがって、どういうわけかより多くのBプログラムを実行して、Aが出力する行を並行して処理できるかどうか疑問に思っています。 つまり、Aはその行を出力し、プログラムBのN個のインスタンスがあり、これらの行を(最初に読み取る人は誰でも)読み取り、処理してstdoutに出力します。 私の最後の質問は: 潜在的に発生する可能性のある競合状態やその他の矛盾を気にすることなく、いくつかのBプロセス間でAに出力をパイプする方法はありますか?

4
シェルに多くのコマンドを送信し、コマンドの終了を待つ方法[終了]
閉じた。この質問には詳細または明確さが必要です。現在、回答を受け付けていません。 この質問を改善したいですか?詳細を追加し、この投稿を編集して問題を明確にします。 2年前に閉店しました。 約20個のコマンドがあり、これらすべてをUnixシェルに送信して結果をコピーする必要がありますが、その方法はわかりません。 これはモバイルネットワーク管理に接続された小さなプログラムであり、この小さなプログラムではコマンドを行で送信し、結果を悲鳴で受信するためのアクセス権があるため、私が持っているシェルについてはわかりません。そのため、スクリプトを使用することはできませんコマンドを送信します。 コマンド1-サーバーに接続します。 コマンド1が終了するまで待つ コマンド2-サーバー1からのすべての情報を更新する 待つ。 コマンド3。パラメータを取得します。 ...などのコマンド。 私が試したとcmd1 | cmd2 | cmd3 し、 cmd1 & cmd2 & cmd3そしてcmd1;cmd2 問題はcmd1、RNC(ネットワーク要素)に接続されていることにcmd2あり、それが理にかなってから15秒ほどかかります。ただし、最初のcmdでのみ機能します。手がかり、これを実行する方法?



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